2012-11-18 24 views
10
Ben knockout.js yeniyim

bağlanma ve bir kullanıcıyı temsil eden aşağıdaki nesneyi bağlamak için çalışıyorum: Bir kullanıcı sıfır veya daha fazla konumun olabilirKnockout.js: Karmaşık nesneye

{ 
    "$id": "1", 
    "$values": [ 
     { 
      "$id": "2", 
      "Locations": { 
       "$id": "3", 
       "$values": [] 
      }, 
      "Photos": { 
       "$id": "4", 
       "$values": [] 
      }, 
      "UserId": 1, 
      "Name": "Test User" 
     } 
    ] 
} 

ve sıfır veya daha fazla fotoğraf.

görünüşüdür modeli:

function UsersViewModel() { 
    var self = this; 
    self.users = ko.observableArray(); 

    var baseUri = 'http://localhost:46241/api/users'; 

    $.getJSON(baseUri, function (data) { 
     self.users = data; 
    }); 
} 

$(document).ready(function() { 
    ko.applyBindings(new UsersViewModel()); 
}) 

HTML içeren bağlayıcı aşağıdaki gibidir:

<ul id="update-users" data-bind="foreach: users"> 
    <li> 
      <div><div class="item">User ID</div> 
       <input type="text" data-bind="value: $data.UserId" /> 
      </div>     
      <div><div class="item">Name</div> 
       <input type="text" data-bind="value: $data.Name" /> 
      </div>     
    </li> 
</ul> 

dışarı düz yanlış bu durumu Am? Veya kullanıcının nesne ve referansları muhtemelen bağlamayı bozuyor mu?

+0

UserId ve Adı gelir:

Daha genel bir kayda göre

, ben senin yerinde olsaydım, herhangi bir amaca hizmet görünmüyor senin JSON bütün $id/$values nosyonunu çıkarmaz çalışacaktı Nesnenin "$ değerler" kısmı altında - sizin bağlayıcınız dahil değilsiniz. $ Değerlerinin bir $ ile başlaması gerçeği, nakavt ile başınızı belaya sokabilir. Nesnenin nasıl üretildiğine dair bir kontrole sahipseniz, $ 'lerin birazını toparlamaktan kurtulmaya değecektir. –

+0

Kendi kendine çalıştığınız kişi = veriler sorunsuz çalışıyor mu? Knockout JS – ryadavilli

cevap

17

mıyım dışarı düz yanlış yapıyor?

Evet. Sen, JSON callback'inde daki observableArray üzerine yazıyorsunuz böylece onu yok: senin durumunda, data.$values içermesi gibi görünüyor

$.getJSON(baseUri, function (data) { 
    self.users(data.$values); 
}); 

Not: Genel olarak

$.getJSON(baseUri, function (data) { 
    self.users = data; 
}); 

, nakavt gözlenebilirlerinin böyle atandığı gerçek dizi, data'un kendisi değil.

Bu

davanız için çalışacak, ama bu tam potansiyeline için nakavt kullanmıyor.

mapping plugin

tam olarak bu durum için oluşturuldu. Karmaşık bir nesneyi yinelemeli olarak değiştirir ve tüm özelliklerini gözlemlenebilir dizilere ve göze çarpan tüm dizileri gözlemlenebilir dizilere dönüştürür. Bu, nesnenin durumu üzerinde ince ayarlı kontrol sağlar ve her değişikliği izlemenizi sağlar.

$.getJSON(baseUri, function (data) { 
    ko.mapping.fromJS(data.$values, {}, self.users); 
}); 

Ayrıca kısmi güncellemeler sağlar: sunucudan kullanıcıların bir listesini alabilir ve görünüm model zaten bunların yarısı vardır varsayalım. Eşleme eklentisi, yalnızca görüntüleme modelinize eksik olanları ve mevcut olanlara uygun değişiklikleri yapabilecek kapasiteye sahiptir. Nasıl yapılacağını öğrenmek istiyorsanız, dokümanlardaki "Advanced usage" section'u okuyun. Eğer haritalama eklentisi sunucusundan kullanıcı nesneleri dizisini almak ve kullanmak varsayarsak


sonra senin şu şekilde görünecektir bağlayıcı: Genel bir not

<ul id="update-users" data-bind="foreach: users"> 
    <li> 
      <div><div class="item">User ID</div> 
       <input type="text" data-bind="value: UserId" /> 
      </div>     
      <div><div class="item">Name</div> 
       <input type="text" data-bind="value: Name" /> 
      </div> 
      <ul class="photos" data-bind="foreach: Photos.$values"> 
       <!-- ... --> 
      <ul> 
    </li> 
</ul> 

, @Greg Smith'in açıklama doğrudur . Nesne tuşlarında $'u kaybetmeye çalışın, bir noktada nakavt sırasında özel değişkenlerle çakışabilirler. Örneğin, bunları alt çizgilerle güvenli bir şekilde değiştirebilirsiniz.

[ 
    { 
     "Locations": [], 
     "Photos": [], 
     "UserId": 1, 
     "Name": "Test User" 
    } 
] 
+0

+1 $ değerlerini yazmayı görmüyorum, bu gerçekten çok yardımcı oluyor. Çok fazla ağır kaldırma yapan haritalama eklentisini kontrol edeceğim. Json'un biçimlendirilmesi için, bu, Entity Framework nesnesinden JSON.NET tarafından üretilmekte olan şeydir. $ Id/$ değer biçimlendirmesini nasıl çıkaracağım? – ryadavilli

+0

'daki çökme seyri için gözlemlenebilir dizininize – verbose

+0

@verbose Bilmiyorum, ama bu başka bir soru için iyi bir malzemedir. Daha önce hiç kimsenin bunu istemediği görülüyor. – Tomalak