在Backbone中使用覆盖的getter渲染视图

Cim*_*imm 0 getter templates json render backbone.js

我正在构建一个小的Backbone.js应用程序并在其中一个模型中添加了一些自定义getter(名称getter返回一个连接的名字和姓氏):

PersonModel = Backbone.Model.extend({
  get: function (attr) {
    if (typeof this[attr] == 'function') {
      return this[attr]();
    }
    return Backbone.Model.prototype.get.call(this, attr);
  },

  name: function() {
    return firstName + " " + lastName;
  }
})
Run Code Online (Sandbox Code Playgroud)

我现在可以使用它person.get("name")来检索名称,很好.但是,当我调用toJSON模型时,这些值不包括在内(我认为这是有意义的).问题是我用它来渲染我的观点:

this.template({people: this.collection.toJSON()});
Run Code Online (Sandbox Code Playgroud)

在Backbone.js中执行此操作的最佳方法是什么?使用覆盖的getter手动创建JSON?

谢谢!

mu *_*ort 5

您可以toJSON在PersonModel上提供自己的方法:

toJSON: function() {
    var attr = Backbone.Model.prototype.toJSON.call(this);
    attr.name = this.name();
    return attr;
}
Run Code Online (Sandbox Code Playgroud)

集合的toJSON只是调用toJSON每个型号:

// The JSON representation of a Collection is an array of the
// models' attributes.
toJSON : function() {
  return this.map(function(model){ return model.toJSON(); });
},
Run Code Online (Sandbox Code Playgroud)

所以添加你自己toJSON的模型应该工作.

您还可以添加name为真实属性,然后调整模型的validate方法以更新nameif firstNamelastName更改,并name在有人尝试将name更改传递给时忽略任何直接尝试更改或抱怨"尝试编辑只读属性" set.没有任何东西可以说它validate不能改变它给出的属性对象,因此你可以在返回之前给{firstName: 'x'}它并将其更改为.这有点滥用,但没有明确禁止改变属性集,它是你唯一的钩子.我想你可以有模式听来改变它自己的事件,并再触发,但随后你可以有事件排序的问题,如果别人是看只有第一个和最后一个名称.{firstName: 'x', name: 'x ' + this.get('lastName')}validatevalidatevalidatefirstNamelastNameset({name: ...})