2014-05-05 9 views
8

Próbuję iterować po tablicy w Ember i usuwać obiekty z tablicy przy pomocy removeObject(). Poniższy przykład usuwa tylko niektóre obiekty z tablicy. Spodziewam się, że iteracyjne nad wszystkimi obiektami, a następnie usunąć je:Ember.js removeObject for forNie usuwaj wszystkich obiektów

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); 
     }); 
    } 
    } 
}); 

szablon jest dość prosta:

<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> 

Oto JSBin: http://jsbin.com/kelinime/4/edit

+1

Gdybym miał zgadywać, removeObject jest mutowania pozycji jak iterację niego. Każda iteracja zmienia obiekt, ale wciąż próbuje dokonać iteracji przez oryginalny obiekt. Może zamiast tego negować warunek i budować nową listę - zamiast 'if (cond) remove;' użyj 'if (! Cond) newList.push (element); items = newList; // lub coś podobnego " – Snnappie

Odpowiedz

11

Snappie powyżej jest poprawne, nie powinien modyfikować kolekcji, którą iterujesz. Użytkownik utworzyłby kopię kolekcji, a następnie ją powtórzył.

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); 
    }); 
} 

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

Zdaję sobie sprawę, mówisz, że nie starają się usunąć wszystkie, ale można również zadzwonić removeObjects z listą obiektów i niech Ember obsługi Iterowanie. Dodatkowo, jeśli pojawi się sprawa, możesz ją również usunąć za pomocą indeksu, używając numeru removeAt.

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

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

+0

Dzięki za pomoc. Czy dopuszczalne jest modyfikowanie lub ustawianie właściwości elementów w kolekcji, którą właśnie powtarzam? – mschoening

+0

zdecydowanie, po prostu nie zaleca się modyfikacji samej kolekcji. Pozycje w kolekcji to darmowa gra – Kingpin2k

+0

Dobra odpowiedź. 'filter' tworzy nową tablicę, więc uważam, że przejście do" removeObjects "działa dobrze. – Caltor

Powiązane problemy