我在代码中有以下行:
terminalsListHtml += this.compiled(_.extend(this.terminals[i], {clazz: 'all'}, obj));
执行此行的行为对我来说是令人惊讶的。
我评估this.compiled
方法的参数值
它看起来像这样:
更多详情:
compiled: _.template($('#terminal-template').text())
让我们回到第一排,结果令我感到惊讶:
它返回以下结果:
this.compiled(_.extend(this.terminals[i], {clazz: 'all'}, obj));
"
<li data-terminal-id="201" class="">
<label>
<input type="checkbox" name="terminal" class="all" data-terminal-id="201" />
<a href="#" title="" class="image"><img
src="getMediumThumbnail/1"
alt=""/></a>
<h3>Second
<small>Lenina, 5</small>
</h3>
<p>Second</p>
<p class="count">Проходимость: <span>10</span> чел./час</p>
<p class="count">Стоимость: <span>5</span> руб./час</p>
<p class="count">Количество свободных слотов: <span>10</span> </p>
</label>
</li>
"
我们可以看到{{imageId}}
已替换为1
。
我不明白这个1
在哪里
请澄清。
很抱歉截图而不是复制的代码。我想粘贴代码,但它渲染不好。
答案 0 :(得分:1)
这一行:
compiled: _.template($('#terminal-template').text())
将字符串(带有id="terminal-template"
的元素的文本内容)转换为可以在以后评估的函数:http://underscorejs.org/#template
然后调用this.compiled( object )
呈现模板(调用te先前编译的模板函数),并将object
设置为上下文,因此如果对象有一个键imageId
,它将被替换为{{imageId}}
在模板字符串中的位置。看起来_.extend(this.terminals[i], {clazz: 'all'}, obj)
返回的对象具有该密钥,它等于1
。
根据您提供的屏幕截图判断,它可能会产生<img src="getMediumThumbnail/undefined" ... />
但imageId
可能来自对象的原型,甚至来自全局范围(已在评论中的讨论中得到确认:window.imageId == 1
)。
编辑:奇怪的是,当使用_.templateSettings
更改语法时,下划线只会到达全局范围:http://jsfiddle.net/hoy9ga0d/ - 使用默认<%= variable %>
不会呈现全局变量,但{{ variable }}
确实如此。