未定义的骨干模型在默认值和范围

时间:2016-02-23 20:26:52

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

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

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

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

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

如果传入数据在键/值对中包含位置属性,则显示该值就好了。

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

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

然后显示&#34; N / A&#34;正如预期的那样。

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

我真的很想了解正在发生的事情,所以我更清楚地知道如何以最正确的方式改变事物以防止范围污染。

2 个答案:

答案 0 :(得分:0)

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

+

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

尝试将模型原样传递给下划线并使用myModel.get(&#34; location&#34;)代替。

答案 1 :(得分:0)

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

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

-

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

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

相关问题