Search code examples
javascriptbackbone.js

remove model in collection and fire remove event - backbone.js


how do I remove remove a model in collection and make the remove event fire . I tried people.remove([{ name: "joe3" }]); but it wont work.

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

Solution

  • By doing:

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

    you don't remove a model, because you pass just an plain object which is not connected to people collection. Instead you could do something like this:

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

    Or:

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

    will work as well.

    So you need to reference actual model object from a collection;

    http://jsfiddle.net/kD9Xu/