2013-02-22 15 views
5

Muhtemelen gerçekten aptalca bir şey özlüyorum, (Ember newbie) ama tamamen yeni bir dizi ayarlamak dışında, Ember Controller'ın yönetimi altındaki bir dizinin nasıl değiştirileceğini anlayamıyorum. Örneğin,Öğeleri bir Ember Controller tarafından yönetilen bir dizide nasıl değiştirebilirim?

. Kontrol cihazımda aşağıdaki test fonksiyonum var. Kullanıcı tıkladığında, kontrol edilen dizinin her bir elemanını (veya tek bir eleman olabilir) yeni bir değerle değiştirmek istiyorum.

Sana Ember bildiği değişiklik yapmak için "set" geçmesi zannediyorsunuz anlıyoruz, bu yüzden bu işe düşündüm:

clickHandler:function(e){ 
    var temp = this.get("itemList").copy(); // copy it 
    for (var i = 0; i < temp.length; i++) { 
     temp[i].desc = "CANCELLED";  // change it 
    } 
    this.set('itemList', temp); // put it back 
} 

Ben dizinin bir kopyası, bunu değiştirmek yapmak, ve sonra geri ayarlayın. Ama bir şekilde Ember, Ember.Set'i kullanmam gerektiğini söyleyerek temp [i] .desc'in içeriğini değiştirdiğim 4. satırdan şikayet ediyor. "Çevrimdışı" kopyasını değiştirebileceğimi ve sonra tekrar ayarlayabileceğimi düşündüm, ama hayır ve neden olduğunu anlayamıyorum. Vardiya/unshift/pop gibi diğer dizi işlemleri işe yarıyor gibi görünüyor.

cevap

11

Yaklaşımınız çok güzel görünmüyor. Bu kod çalışacak:

clickHandler:function(e){ 
    var itemList = this.get("itemList"); 
    itemList.forEach(function(item){ // for iterating over an array, always use the forEach function 
     item.set("desc", "CANCELLED"); // you have to call this set()-function to make changes to an Ember Object 
    }); 
} 

Neden seti() aramak gerekiyor - yönteminizi ve doğrudan erişim yaklaşımını kullanamıyorum?

Set() - yöntemi, Ember'in otomatikleştirme sihrini gerçekleştirmesini sağlar. Bu yöntem çağrıldığında, değiştirilen özelliğe bağlı nesneler üzerinde gerçekleştirilmesi gereken tüm şeyler zamanlanır. En kolay örnek, bir güncellemeye ihtiyaç duyan mülkün görüntülendiği bir şablondur. İşte

kod üzerinde olası bir iyileşme

yukarıda daha emberish yapmak: Sen itemList yönetmek için bir ArrayController kullanabilirsiniz. Bu durumda, itemList öğenizi denetleyicinin content özelliği olarak ayarlarsınız. Bir dizi ile uğraşırken birçok öğreticinin bu denetleyiciden yararlandığını fark edeceksiniz.

App.ItemListController = Ember.ArrayController.extend({ 
    content : null, //set your itemList into this property 
    clickHandler:function(e){ 
     this.get("content").setEach("desc", "CANCELLED"); 
    } 
}); 
+0

Teşekkür ederiz. Yığın Taşması konusunda eğitmek için zaman ayırdığınız çocuklar harika. Ne yazık ki, bu çözümlerden hiçbiri benim için çalışmıyor. Her iki durumda da hatayı alıyorum "Uncaught TypeError: Nesne # " set "yöntemine sahip değil" Hata ayıklayıcısına göre, geri aldığım 'madde' işe yaradığı gibi görünüyor: item: Object __ember1361578135008_meta: Meta desc: function() { get name: function() { set desc: işlev() { set name: işlev() { __proto__: Object –

+1

Öneriniz tamamen anlamlıdır, sadece nedenini anlayamıyorum işe yaramıyor. Bir ArrayController ve satır: this.get ("content") kullanırsam setEach ('desc', "CANCELED"); sonra tüm şablon öğelerimin "İPTAL EDİLDİ" durumuna getirildiğini görüyorum, bu yüzden her şeyin çalıştığını biliyorum, ancak "forEach" kullanırsam, geri döndüğüm "öğe" bir "çağrı" çağrısını kabul etmeyecektir. :^( –

+0

Çoktan 3 ay önce insanlar beni işe koyduğumda çok mutlu olmuştum. Örneğini bir kemanın içine koyabilir misin? Birkaç dakika içinde basit bir sanal şablona bağlantı göndereceğim. – mavilein

İlgili konular