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