gpt4 book ai didi

backbone.js - 主干/下划线模板——渲染时为什么调用 toJSON?

转载 作者:行者123 更新时间:2023-12-04 03:27:08 26 4
gpt4 key购买 nike

当使用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。

看到这些片段后,我意识到没有必要克隆属性。相反,我可以直接传入我的模型(尽管模板中有一些语法更改)。就像是 ...
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 的唯一原因是:
  • 保护模型数据免受恶意查看
  • View 在本地修改数据(在我看来不是一个好主意),
  • View 需要使用数组/字符串语法( obj[ namepart + someindex] )
  • 访问值

    我的问题归结为:我为什么要打电话 toJSON()并尝试克隆属性,而不是仅在我的模板中使用 get()?

    最佳答案

    也许以下是有道理的:

  • 插值而不是评估是一个很大的成本。所以你的模板版本实际上比调用 toJSon() 慢很多并使用评估。
  • 逻辑属于 View 而不是模板。只有在必要时才应在模板中引入 js 代码(以及对插值的需求)。
  • 有人可能会争辩说你应该通过 model.attributes而不是 model.toJSON()避免克隆。我想不这样做的原因是为了避免允许模板更改模型的属性。此外,您通常可能希望增加 model.toJSON() 的结果。与其他事情,显然您不想在 model.attributes 上做这些事情
  • 关于backbone.js - 主干/下划线模板——渲染时为什么调用 toJSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10322016/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com