2013-02-25 19 views
17

Jak usunąć usuń model z kolekcji i zwolnij wydarzenie. Próbowałem people.remove([{ name: "joe3" }]);, ale to nie zadziała.usuń model w kolekcji i usuń zdarzenie usuwania - backbone.js

var Person = Backbone.Model.extend({ 

    initialize: function() { 
     console.log(" person is initialized"); 
    }, 
    defaults: { 
     name: "underfined", 
     age:"underfined" 
    } 
}); 

var People = Backbone.Collection.extend({ 
    initialize: function() { 
     console.log("people collection is initialized"); 
     this.bind('add', this.onModelAdded, this); 
     this.bind('remove', this.onModelRemoved, this); 
    }, 
    model: Person, 
    onModelAdded: function(model, collection, options) { 
     console.log("options = ", options); 
     alert("added"); 
    }, 
    onModelRemoved: function (model, collection, options) { 
     console.log("options = ", options); 
     alert("removed"); 
    }, 
}); 

//var person = new Person({ name: "joe1" }); 
var people = new People(); 



//people.add([{ name: "joe2" }]); 
people.add([{ name: "joe1" }]); 
people.add([{ name: "joe2" }]); 
people.add([{ name: "joe3" }]); 
people.add([{ name: "joe4" }]); 
people.add([{ name: "joe5" }]); 

people.remove([{ name: "joe3" }]); 



console.log(people.toJSON()); 

Odpowiedz

30

Robiąc:

people.remove([{ name: "joe3" }]); 

nie usuniesz model, ponieważ przechodzą tylko zwykły przedmiot, który nie jest podłączony do people kolekcji. Zamiast tego można zrobić coś takiego:

people.remove(people.at(2)); 

czyli

var model = new Person({name: "joe3"}); 
people.add(model); 
... 
people.remove(model); 

będzie działać jak również.

Musisz więc odwołać się do rzeczywistego obiektu modelu z kolekcji;

http://jsfiddle.net/kD9Xu/

+0

thnaks - jedno pytanie proszę - w jaki sposób mogę uzyskać wartości właściwości modelu w usunięta funkcja: onModelRemoved: function (model, collection, options) { console.log ("options =", options); Alert ("removed" + model.attributes.name + "" + model.attributes.age + "został usunięty"); }, –

+0

model.attributes.age nie działa –

+3

model.get ('age') –

5
var Person = Backbone.Model.extend({ 
    defaults: { 
     name: "underfined", 
     age:"underfined" 
    } 
}); 

var People = Backbone.Collection.extend({ 
    initialize: function() { 
     this.bind('remove', this.onModelRemoved, this); 
    }, 
    model: Person, 
    onModelRemoved: function (model, collection, options) { 
     alert("removed"); 
    }, 
    getByName: function(name){ 
     return this.filter(function(val) { 
      return val.get("name") === name; 
     }) 
    } 
}); 

var people = new People(); 

people.add(new Person({name:"joe1"})); 
people.add(new Person({name:"joe2"})); 
people.remove(people.getByName("joe1")); 

console.info(people.toJSON()); 
+0

następnie dlaczego nie usunąćByName() – Tosh

+0

masz rację. To szybki przykład: –

34

dla nikogo szuka Usuń gdzie można po prostu łańcuch go z rozmowy collection.where. jak tak, aby usunąć wszystkie pozycje pasujące szukania:

people.remove(people.where({name: "joe3"})); 

widzieć Backbone collection.where

+3

imo, najlepsza odpowiedź – walv

+0

Tak, to też było tym, czego szukałem. Prosta, prosta odpowiedź, która działa. – mcraen

4

Innym sposobem jest krótszy trochę i pożary usunąć imprezę dla kolekcji, a także:

people.at(2).destroy(); 
// OR 
people.where({name: "joe2"})[0].destroy(); 

Wywołuje zdarzenie "destroy" w modelu, które będzie wirować przez wszystkie kolekcje, które go zawierają. . http://backbonejs.org/#Model-destroy

0

w celu usunięcia „[0]” można użyć następującego kodu:

people.findWhere({name: "joe2"}).destroy();