骨干/下划线模板 - 渲染时为什么要调用toJSON?

EBa*_*arr 7 backbone.js underscore.js

当使用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
Run Code Online (Sandbox Code Playgroud)

一种替代方法

我挖掘了主干0.9.2并强调了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
Run Code Online (Sandbox Code Playgroud)

看看这两个例子,我可以提出调用JSON的唯一原因是:

  • 从邪恶的角度保护模型数据
  • 本地视图修改数据(在我看来不是一个好主意),
  • 视图需要使用数组/字符串语法(obj[ namepart + someindex])访问值

我的问题归结为:为什么我会调用toJSON()并获取克隆属性的命中,而不是仅仅在我的模板中使用get()?

ggo*_*zad 12

也许以下有意义:

  1. 插值而不是评估是一个很大的成本.所以你的模板的版本实际上比调用慢了许多toJSon(),并利用评价研究.

  2. 逻辑属于视图而非模板.只有在必要时才应在模板中引入js代码(以及插值的需要).

  3. 有人可能会说你应该通过model.attributes而不是model.toJSON()避免克隆.我想不这样做的原因是避免允许模板更改模型的属性.此外,您通常可能希望增加model.toJSON()其他内容的结果,这显然是您不想对其进行的model.attributes

  • 应该注意的是,对于视图,建议使用`model.toJSON()`...它用于序列化模型以进行同步,而不是渲染.你应该按照你的建议传递`model.attributes`.https://github.com/jashkenas/backbone/issues/2134 (2认同)