【问题标题】:Backbone Relational: remove event not fired骨干关系:删除事件未触发
【发布时间】:2012-12-18 00:33:34
【问题描述】:

我正在尝试使用 Backbone Relational 设置一对模型,但我不明白删除事件是如何触发的。

这是我的模型代码:

var Car = Backbone.RelationalModel.extend({
    idAttribute: "id"
});

var Cars = Backbone.Collection.extend({
    model: Car
});

var CarCollection = new Cars();

var User = Backbone.RelationalModel.extend({

    idAttribute: 'id',
    relations: [{
        type: Backbone.HasMany,
        key: 'model',
        relatedModel: Car,
        collectionType: Cars,
        includeInJSON: 'model',
        reverseRelation: {
            key: 'ownedBy',
            includeinJSON: 'name'
        }
    }]

  });

var Users = Backbone.Collection.extend({
    model: User
});

var UserCollection = new Users();

//Bootstrap data and put it in the collections

var carsData = [
    {id:1, model:'500',ownedBy:1},
    {id:2, model:'Corsa',ownedBy:2},
    {id:3, model:'Civic',ownedBy:2}
];

var usersData = [
    {id:1,name:'Dude'},
    {id:2,name:'Mark'}
];

CarCollection.add(carsData);
UserCollection.add(usersData);

我在 JSON 中得到的是:

UserCollection = {"id":1,"name":"Dude","model":["500"]}{"id":2,"name":"Mark","model":["Corsa","Civic"]}

CarCollection = {"id":1,"model":"500","ownedBy":"Dude"}{"id":2,"model":"Corsa","ownedBy":"Mark"}{"id":3,"model":"Civic","ownedBy":"Mark"}

现在,如果我像这样向 CarCollection 添加一个元素:

CarCollection.add({id:4,model:'Prius',ownedBy:1};);

'add' 事件被触发,但如果我从集合中删除一个元素:

var el = CarCollection.get(1);
CarCollection.remove(el);

没有事件被触发。

我已经通过一些解决方法解决了这个问题,例如:

var el = CarCollection.get(1);
el.destroy();

或直接在 Backbone.store 中取消注册:

Backbone.Relational.store.unregister(el);

或者只是将ownedBy设置为null:

var el = CarCollection.get(1);
el.set("ownedBy",null);

这是插件的正确行为吗?或者我以错误的方式配置了我的模型?感谢您的每一个答案。

【问题讨论】:

    标签: javascript backbone.js model backbone-relational


    【解决方案1】:

    您必须将模型传递给remove 而不是索引

    Collection.remove(model)
    

    您可以执行以下操作:

    CarCollection.remove(CarCollection.at(0));
    

    删除索引为 0 的模型或 ...

    CarCollection.remove(CarCollection.get(4));
    

    移除 id 为 4 的模型

    【讨论】:

    • 对不起,我在代码中放错了例子,我现在已经更新了。我已经按照您建议的方式进行了尝试。如果我在删除后记录 CarCollection,它只包含 2 个元素(正确),但 UserCollection 没有更新,并且没有触发 remove:model 事件:\
    • 我不知道这是否是您的完整代码,但在您的示例中,您没有将 CarCollection 绑定到用户。我认为您的 RelationalModel aka User 有自己的 Cars 实例(保持为空)。顺便提一句。我没有使用过 Backbone.RelationalModel,所以这只是一个猜测。
    • 好吧,reverseRelation in User RelationalModel 应该会解决这个问题。事实上CarCollection.add() 触发相关事件。我发现触发 remove 事件的另一种方法是将 CarCollection 中的元素的 ownedBy 值设置为 null。也许这只是正确的行为,但我在 Docs 上找不到任何可以确认的东西。无论如何感谢您的帮助!
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多