下划线如何替换变量?

时间:2015-01-27 21:16:59

标签: javascript templates underscore.js frontend

我在代码中有以下行:

 terminalsListHtml += this.compiled(_.extend(this.terminals[i], {clazz: 'all'}, obj));

执行此行的行为对我来说是令人惊讶的。

我评估this.compiled方法的参数值 它看起来像这样:

enter image description here

更多详情:

compiled: _.template($('#terminal-template').text())

enter image description here 让我们回到第一排,结果令我感到惊讶:

它返回以下结果:

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在哪里  请澄清。

P.P.S。

很抱歉截图而不是复制的代码。我想粘贴代码,但它渲染不好。

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 }}确实如此。