【问题标题】:Backbone model undefined attributed in defaults and scope骨干模型未定义归因于默认值和范围
【发布时间】:2016-06-05 21:00:59
【问题描述】:

似乎如果骨干模型没有为模板中引用的属性设置默认设置,它会在全局范围内查找? (编辑:我也在使用 Marionette 和 Underscore)

我有一个包含以下内容的模板:

<td><@= ((location !== null)?location:'N/A') @></td>

当它被渲染时,它会显示页面的 URL,包括哈希。我假设它显示来自全局命名空间 (Window.location.toString()) 的位置。当填充模型的传入 JSON 字符串没有定义位置属性并且模型没有默认设置时,就会发生这种情况。

如果传入的数据在键/值对中包含位置属性,它会很好地显示该值。

如果传入的数据不包含该属性,但模型上有一个默认设置:

myModel = io.models.BaseModel.extend({
    defaults: {
        location:null,...

然后它会按预期显示“N/A”。

我想我的问题是,主干是这样滚动的吗?如果模型上未定义该属性,那么它是否会查看其他范围?或者这与渲染模板时如何评估位置有关?

我真的很想了解正在发生的事情,以便更好地了解我可能需要如何进行更改以以最正确的方式防止范围污染。

【问题讨论】:

    标签: javascript backbone.js marionette underscore.js-templating


    【解决方案1】:

    我从未见过主干模型访问全局范围。无论如何,这似乎没有连接到主干,确切地说,它没有附带模板引擎。模板通常由下划线处理,我也在我的项目中使用过。我想你正在传递这样的模型属性:

    myModel.toJSON();
    

    这将返回一个包含所有属性键/值对的对象。然后可以在模板中访问它们,就好像它们已被定义为变量一样。 Underscore 不知道模型,它只会访问传递给它的变量。如果没有名为“位置”的变量,它将从全局对象“窗口”中获取。这是 javascript 的正常行为。

    尝试按原样传递模型以加下划线并改用 myModel.get("location")。

    【讨论】:

    • 不完全。问题是编译的下划线模板使用with 使传递的对象看起来像一个范围,然后在解决问题时with 上升到window。有_.template 选项可以禁止使用with。将整个模型传递给模板通常被认为是一个坏主意。
    • Daniel — 抱歉,我使用的是下划线。我更新了我的问题,但它一定是在你回答的同时。
    • @muistooshort 太短了——这听起来很合理,也很有意义。感谢您提供有关下划线模板选项的提示。
    【解决方案2】:

    我通过使用@muistooshort 所述的variable 模板选项并使用模板中定义的命名空间解决了这个问题。

    _.templateSettings = {
        variable: "_tdata"
    };
    

    -

    <td><@= ((location !== null)?_tdata.location:'N/A') @></td>
    

    更新所有模板有点痛苦,但最终效果很好。似乎应该有一个更简单的实现,比如下划线模板设置中的一个简单标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多