为什么JavaScript字符串数组被jQuery模板{{each}}标签与jQuery $ .each解释不同?

时间:2011-09-15 17:00:08

标签: jquery jquery-templates

强制性jsFiddle example

当我通过jQuery的$.each函数运行一个字符串数组时,我得到了我期望的结果。

$.each(["abc", "123", "def", "456"], function (i, val) {
    $("<li></li>").text("source[" + i + "]: " + val).appendTo(".eachResults");
    // run for each string in the array ("abc", "123", ...)
});

当我通过jQuery Template的{{each}}运算符运行相同的字符串数组时,它会将其视为char s的二维数组。

<script id="testTemplate" type="text/x-jquery-tmpl"> 
<ul>
    {{each(i, prop) $data}}
    {{if $data.hasOwnProperty(i)}}
    <li>
        source[${i}]: ${$data[i]}
        {{! run for each char of each string in array (0:"a", 1:"b", 2:"c", 0:"1", 1:"2", 3:"3", ...)}}
    </li>
    {{/if}}
    {{/each}}
</ul>
</script>

$("#testTemplate").tmpl(["abc", "123", "def", "456"]).appendTo(".tmplResults");

由于模板中的i似乎总是正确引用到$data,因此我根本不知道这个索引是如何工作的。似乎i需要是一个二维索引才能正常工作,但它似乎不是(typeof (i) === "number")。

后续问题

@ mblase75当然在这里解释了这个问题。不幸的是,鉴于这是我实际代码的一部分,结果只是提出了一个不同的question about recursively calling an {{each}} template when you come across an array of strings

1 个答案:

答案 0 :(得分:4)

请记住,模板是一个隐式循环。您的原始{{each}}循环遍历每个字符串中的每个字符 - 模板循环遍历数组中的每个字符串。

这将为您提供所需的结果(或多或少):

<script id="testTemplate" type="text/x-jquery-tmpl"> 
    <li>
        source[]: ${$data}
    </li>
</script>

http://jsfiddle.net/wuEyp/10/使用上述代码。索引消失了,因为模板似乎没有在“根”级别提供它。

http://jsfiddle.net/wuEyp/11将使用函数添加索引。出于某种原因,我无法通过闭合来正确地做到这一点。