【发布时间】:2012-04-25 18:54:53
【问题描述】:
当在下划线中使用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 和下划线 1.3.3 代码。在主干中,注意到model.toJSON() 执行以下操作:_.clone(this.attributes)。在模板渲染引擎中,我编译的模板将传递的数据命名为 obj。
在看到那些 sn-ps 之后,我意识到克隆属性是没有必要的。相反,我可以直接传入我的模型(尽管模板中有一些语法更改)。有点像...
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
看看这两个例子,我能想到调用 toJSON 的唯一原因是:
- 保护模型数据不被恶意查看
- 视图在本地修改数据(我认为这不是一个好主意),
- 视图需要使用数组/字符串语法访问值(
obj[ namepart + someindex])
我的问题归结为:我为什么要调用toJSON() 并接受克隆属性的打击,而不是在我的模板中使用 get()?
【问题讨论】:
-
“克隆成功”?你认为拨打
get是免费的吗? -
@muistooshort -- 免费?不。
Get()是return this.attributes[attr];。那么数组查找比数组克隆更快吗?是的——从资源和时间两方面来说,但这不符合我的观点。调用toJSON()显然是骨干社区集体思维的一部分。我很好奇为什么。 -
“重复的函数调用和对象访问”与“一个克隆和重复的对象访问”相比,我没有看到任何基准测试结果,所以您的 Yes 只是意见(就像所有答案都将是,因此“非建设性”投票)。并非每个视图都将是模型或集合的直接映射,
toJSON更灵活并减少了模板中的噪音。 -
抱歉,您似乎对此很生气。您关于“不一定是直接映射”的理由是一个很好的建设性答案。
-
我没有生气,cmets 需要简短,我认为这种讨论不属于这里,无关个人。