我有一个User
实体,其subscriptions
属性。这是一组ID。
当我执行提取时,API将填充subscriptions
,并返回如下内容:
{
subscriptions: [1, 2, 3],
__subscriptions: [
{
id: 1,
name: 'Example'
},
{
id: 2,
name: 'Example'
},
{
id: 3,
name: 'Example'
}
]
}
我已经完成了这项工作,因此我仍然可以对原始subscriptions
执行操作,然后将其保存回API。我对__subscriptions
所做的任何更改都不会保留,因为API无法识别此字段 - 它只是填充的数据。
在parse
的{{1}}函数中,我创建了嵌套集合:
User
但是,如果我要删除订阅,我必须将其从parse: function (response) {
this.subscriptions = new Subscriptions(response.__subscriptions)
}
实体的subscriptions
字段中拼接出来,然后我还必须将其从User
中删除收集的内容为subscriptions
上的属性:
User
这有点烦人。理想情况下,从// Clone the subscriptions property, delete the model with a matching ID, and then set it again.
var value = _.clone(this.get('subscriptions'))
// Use splice instead of delete so that we don't leave an undefined value
// in the array
value.splice(value.indexOf(model.id), 1)
// Also remove the same model from the nested collection
var removedSubscription = this.subscriptions.get(model)
this.subscriptions.remove(removedSubscription)
this.set('subscriptions', value)
this.save()
属性中删除ID应自动更新集合。
这似乎是处理嵌套模型和集合的好方法吗?我听说过关于Backbone.Relational的坏话,所以我对一个更简单的解决方案感兴趣。
答案 0 :(得分:2)
我会听取Subscriptions集合的事件并相应地更新订阅参数。
var User = Backbone.Model.extend({
initialize: function () {
this.subscriptions = new Subscriptions;
this.subscriptions.on('add remove', this.updateSubscriptions, this)
},
updateSubscriptions: function() {
this.set('subscriptions', this.subscriptions.pluck('id'))
},
parse: function (response) {
this.subscriptions.reset(response.__subscriptions);
return Backbone.Model.parse.call(this, response);
}
});
然后删除订阅将更新用户模型的subscriptions
属性:
user.subscriptions.remove(subscription)