2014-05-05 10 views
8

Ember'de bir dizi üzerinde yineleme yapmaya çalışıyorum ve removeObject() ile dizideki nesneleri kaldırın. Aşağıdaki örnek, diziden yalnızca bazı nesneleri kaldırır. Ben bunları kaldırmak sonra tüm nesneler üzerinde yineleme ve beklediğiniz:Ember.js removeObject inEach in all Tümünü kaldır Nesneler

App = Ember.Application.create(); 

App.ITEM_FIXUTRES = [ 
    'Item 1', 
    'Item 2' 
]; 

App.ITEM_FIXTURES = App.ITEM_FIXUTRES.map(function (item) { 
    return Ember.Object.create({title: item}); 
}); 

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return App.ITEM_FIXTURES; 
    }, 

    actions: { 
    add: function(title) { 
     var items = this.modelFor('index'); 
     items.addObject(Ember.Object.create({title: title})); 

     this.controller.set('title', ''); 
    }, 
    removeAll: function() { 
     var items = this.modelFor('index'); 

     items.forEach(function (item) { 
     // I actually only want to remove certain objects with specific 
     // properties but this illustrates the issue. 
     items.removeObject(item); 
     }); 
    } 
    } 
}); 

şablon oldukça basittir:

İşte
<script type="text/x-handlebars" id="index"> 
    <h4>Collection List</h4> 

    <button {{action 'removeAll'}}>Remove All</button> 

    <ul> 
    {{#each}} 
     <li>{{title}}</li> 
    {{/each}} 

    <li>{{input type='text' value=title action='add'}}</li> 
    </ul> 
</script> 

bir JSBin geçerli: http://jsbin.com/kelinime/4/edit

+1

, RemoveObject öğeleri mutasyona edilir. Her yineleme, nesneyi değiştiriyor ancak yine de orijinal nesnenin üzerinden yineleme yapmaya çalışıyor. Belki bunun yerine durumu ortadan kaldırır ve yeni bir liste oluşturur - eğer (kondisyonu kaldır) yerine '' use (— cond) newList.push (item); öğeler = newList; // ya benzer bir şey ' – Snnappie

cevap

11

Snappie yukarıdaki doğru, teşekkür Yinelediğiniz bir koleksiyonu değiştirmemelidir. Koleksiyonun bir kopyasını oluşturursun, sonra tekrarla.

http://jsbin.com/kelinime/7/edit

removeAll: function() { 
    var items = this.modelFor('index'), 
     list = items.toArray(); 

    list.forEach(function (item) { 
    // I actually only want to remove certain objects with specific 
    // properties but this illustrates the issue. 
    items.removeObject(item); 
    }); 
} 

Ben size hepsini silmek çalışmıyoruz demek fark, ama aynı zamanda nesnelerin bir listesini removeObjects arayıp Kor iterating ele sağlayabilirsiniz. Ek olarak, durum ortaya çıkarsa, removeAt'u kullanarak dizine de ekleyebilirsiniz. Ben tahmin etmek olsaydı bunun üzerinden yineleme olarak

removeAll: function() { 
    var items = this.modelFor('index'), 
     list = items.toArray(); 
    items.removeObjects(list); 
} 

http://jsbin.com/kelinime/8/edit

+0

Yardımlarınız için teşekkürler. Yinelenen bir koleksiyondaki öğelerin özelliklerini değiştirmek veya ayarlamak kabul edilebilir mi? – mschoening

+0

kesinlikle, koleksiyonun kendisini değiştirmesi tavsiye edilir. Koleksiyondaki öğeler ücretsiz oyun – Kingpin2k

+0

Güzel cevap. 'filter' yeni bir dizi yaratır, bu yüzden sonucunu çıkarmak için 'removeObjects' iyi çalışır. – Caltor