我想从模板访问计算字段我在模型(Backbone.js的)来实现。 我需要一直以定义一个帮助做呢?
我认为这个问题与我的模型传递到模板的方式做。 如果我通过this.model.toJSON()我有机会获得属性,但不是我在它定义的函数。 如果我通过this.model直接我可以访问功能,但骨干模式不是属性。
我想从模板访问计算字段我在模型(Backbone.js的)来实现。 我需要一直以定义一个帮助做呢?
我认为这个问题与我的模型传递到模板的方式做。 如果我通过this.model.toJSON()我有机会获得属性,但不是我在它定义的函数。 如果我通过this.model直接我可以访问功能,但骨干模式不是属性。
总是传递this.model.toJSON()
到您的模板。
你需要做的就是你计算出的值是什么,是覆盖您toJSON
方法,您的手机型号。
MyModel = Backbone.Model.extend({
myValue: function(){
return "this is a calculated value";
},
toJSON: function(){
// get the standard json for the object
var json = Backbone.Model.prototype.toJSON.apply(this, arguments);
// get the calculated value
json.myValue = this.myValue();
// send it all back
return json;
}
})
现在,您可以访问myValue
从由返回的JSON toJSON
,这意味着你可以访问它的视图。
另一种选择,正如你所说,是建立辅助方法,并与把手注册。 除非你有改变基于模板是如何被呈现,和/或正在传递到模板什么数据的一些功能,我不会打扰。
这是另一种可能性:(从模型初始化)
initialize: function() {
this.on("change", function () {
this.set({ calculatedColumn: this.get("otherColumn") }, { silent: true });
});
},
在骨干计算属性
我有同样的问题。 @DerickBailey是对的,当然,是压倒一切的toJSON做这项工作。 但它也泄漏到与服务器的通信(见姆姆对他的答案的评论)。
所以最终,我建立了一个骨干插件来专门处理数据导出到模板,并以最简单的操作: Backbone.Marionette.Export 。 它还涉及嵌套结构,照顾循环引用等查看文档 。
下面是它如何工作的。 包括插件文件到您的项目,并申报
MyModel = Backbone.Model.extend({
foo: function () {
return "I am a calculated value";
},
exportable: "foo" // <-- this is the one line you have to add
});
如果你是一个木偶的用户,您已经在这一点上做。 foo
显示在你的模板,就好像它是一个模型属性。
在平原骨干观点,只是叫myModel.export()
或myCollection.export()
而不是他们的toJSON同行当你呈现。
对于服用参数的方法,有一个onExport
处理程序。 例如,同样是在文档 。
做到这一点的最好办法是将它添加到你的模型:
function initialize() {
this.set("calculatedColumn", function () { return this.otherColumn; });
}
主干模型通常内部存储在“model.attributes”的实际数据值。 这就是为什么当你直接传递模型的模板,它只是增加了功能,直接建模和没有任何数据。 如果你使用model.toJSON()它通常在骨干为_.clone(model.attributes)来实现(见Backbone.js的)。 所以,你有数据,而不是直接添加到模型的功能。 这就是为什么上述作品 - 你设置的功能上model.attributes,而不是模型对象本身。 不要直接引用model.attributes,使用model.get( “calculatedColumn”)和model.set( “calculatedColumn”,...)。
所以model.get( “calculatedColumn”)返回的功能。 如果你去{{calculatedColumn}}在车把(假设你使用把手),它显示了函数的返回值。 但由于骨干网做了JSON.stringify到model.toJSON同步(在Backbone.js的)和JSON.stringify忽略功能calculatedColumn不会被发送到服务器。 如果你想JSON.stringify到不能忽视的功能(这样的功能变成的toJSON时是在模型运行数据值 - 视图渲染和模型同步-ING期间),覆盖model.toJSON就像@Derick贝利描述。
另外,还可以从Backbone.Model派生自己BaseModel并覆盖.toJSON,如果你需要得到来自BaseModel您的所有车型。 那么你就需要.toJSON的一个通用版本,可应用于任何模型。