2013-02-25 5 views
17

Wie entferne ich ein Modell in der Sammlung entfernen und das Ereignis löschen Feuer auslösen. Ich habe versucht people.remove([{ name: "joe3" }]);, aber es wird nicht funktionieren.Entfernen Sie das Modell in der Sammlung und Feuer entfernen Ereignis - 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()); 

Antwort

30

Dadurch:

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

Sie entferne kein Modell, weil Sie nur eine Ebene-Objekt übergeben, die an people Sammlung nicht angeschlossen ist. Stattdessen könnten Sie so etwas tun:

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

Oder:

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

wird auch funktionieren.

Sie müssen also das tatsächliche Modellobjekt aus einer Sammlung referenzieren;

http://jsfiddle.net/kD9Xu/

+0

thnaks - eine weitere Frage bitte - wie bekomme ich die Werte der Eigenschaften des Modells in die entfernte Funktion: onModelRemoved: function (Modell, Sammlung, Optionen) { console.log ("options =", options); alert ("removed" + model.attributes.name + "" + model.attributes.age + "wurde entfernt"); }, –

+0

model.attributes.age funktioniert nicht –

+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

dann warum nicht removeByName() – Tosh

+0

Sie haben Recht. Es ist ein schnelles Beispiel –

34

Für alle anderen für ein Entfernen, wo Sie es einfach mit einem collection.where Call-Kette kann. wie so alle Elemente zu entfernen, die Suche entsprechen:

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

siehe Backbone collection.where

+3

imo, die beste Antwort – walv

+0

Ja, das schien auch das zu sein, wonach ich suchte. Einfache, direkte Antwort, die funktioniert. – mcraen

4

Ein anderer Weg kürzer ist ein wenig und feuert die Ereignis für eine Sammlung entfernen und:

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

Löst ein "destroy" -Ereignis auf dem Modell aus, das durch alle Sammlungen blubbern wird, die es enthalten. . http://backbonejs.org/#Model-destroy

0

Um zu entfernen „[0]“ Sie den folgenden Code verwenden:

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