在下划线中使用backbone.js和伴随模板引擎时,我注意到大多数示例在渲染时调用model.ToJSON()
而不是仅传递model
。我知道我的模板必须修改它检索数据的方式。
我想知道为什么&我们从toJSON()获得了什么好处?
典型示例
在典型示例中,model.toJSON()
在渲染时被调用。请注意,为了简洁起见,我将模板放在字符串文字中。
ToDoItemView = Backbone.View.extend({
/* other viewey stuff */
template : _.template( '<li><%=ToDoNote%></li>'),
render : function () {
var out= this.template(this.model.toJSON()); //<--JSON
$(this.el).html( out) }
return this;
}
}); //end view
替代方法
我挖掘了骨干网0.9.2&amp;强调1.3.3代码。在骨干网中,注意到model.toJSON()
执行以下操作:_.clone(this.attributes)
。在模板渲染引擎中,我编译的模板命名传递的数据 obj 。
在看到这些片段之后,我意识到克隆属性是没有必要的。相反,我可以直接传入我的模型(虽然模板中有一些语法更改)。有点像...
ToDoItemView = Backbone.View.extend({
/* other viewey stuff */
template : _.template( '<li><%=obj.get('ToDoNote')%></li>'), //<--notice GET()
render : function () {
var out= this.template(this.model); //<-- look ma no json
$(this.el).html( result ) }
return this;
}
}); //end view
看看这两个例子,我可以提出调用JSON的唯一原因是:
obj[ namepart + someindex]
)我的问题归结为:为什么我会调用toJSON()
并使用命中来克隆属性,而不是仅仅在我的模板中使用get()?
答案 0 :(得分:12)
以下可能有意义:
插值而不是评估是一个很大的代价。因此,您的模板的版本实际上比调用toJSon()
和使用评估要慢得多。
逻辑属于视图而非模板。只有在必要时才应在模板中引入js代码(以及插值的需要)。
有人可能会说你应该通过model.attributes
而不是model.toJSON()
来避免克隆。我想不这样做的原因是避免允许模板更改模型的属性。此外,您可能通常希望将model.toJSON()
的结果与其他内容相加,这显然是您不希望在model.attributes
答案 1 :(得分:2)
一个可能的原因是因为Backbone.js的开发人员允许你使用你想要的任何模板引擎,并且许多模板引擎都使用简单的javascript对象,而不是 Backbone Models。