在更改时更新分层模型的正确方法是什么?

时间:2016-04-05 11:46:15

标签: javascript backbone.js

我有以下对话框模型:

var DialogModel = Backbone.Model.extend({

   user: null,

   constructor: function () {
      // Initialize user model
      this.user = new BW.user.UserModel();

      Backbone.Model.apply(this, arguments);
   },

   parse: function (attributes) {
      _.isObject(attributes) || (attributes = {});

      // update user's model data
      this.user.set(attributes.user);
      delete attributes.user;

      return attributes;
   },

   toJSON: fucntion () {
      var json = Backbone.Model.prototype.toJSON.call(this);

      // serialize user's model data to JSON
      _.extend(json, user: this.model.toJSON());
   }
});

从上面的代码中可以看出,我将user模型存储到DialogModel并在parse上设置数据并在toJSON中序列化。

在某些时间点,我得到dialog:update套接字消息,其中包含以下数据:

{
   id: 1,
   message: 'message',
   user: {
      <JSON USER DATA>
   }
}

要根据此消息数据更新对话框,请执行以下操作:

eventBus.on('dialog:update', function (json) {
   dialogModel.set(json);
});

但问题是user模型没有得到更新,因为parse方法不会执行。

所以我的问题是如何在user方法上更新set模型?

1 个答案:

答案 0 :(得分:0)

一种选择是覆盖model.set。在DialogModel中添加以下内容即可:

set: function (attributes, options) {
    this.parse(attributes);
    Backbone.Model.prototype.set.apply(this, arguments);
},

请注意,我选择调用parse方法,因为它很好地设置了用户数据并将其从我们的属性中删除(从而阻止在dialogModel上设置数据)。

Click here for a fiddle demonstrating this solution