嵌套Backbone模型或集合以便它们被链接

时间:2013-05-05 09:44:27

标签: api backbone.js collections model entity-relationship

我有一个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的坏话,所以我对一个更简单的解决方案感兴趣。

1 个答案:

答案 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)