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

时间:2012-04-25 18:54:54

标签: 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

替代方法

我挖掘了骨干网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的唯一原因是:

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

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

2 个答案:

答案 0 :(得分:12)

以下可能有意义:

  1. 插值而不是评估是一个很大的代价。因此,您的模板的版本实际上比调用toJSon()和使用评估要慢得多。

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

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

  4. 上进行的

答案 1 :(得分:2)

一个可能的原因是因为Backbone.js的开发人员允许你使用你想要的任何模板引擎,并且许多模板引擎都使用简单的javascript对象,而不是 Backbone Models。