【问题标题】:Why are JavaScript string arrays interpreted differently by jQuery template {{each}} tags vs. jQuery $.each?为什么 jQuery 模板 {{each}} 标签与 jQuery $.each 对 JavaScript 字符串数组的解释不同?
【发布时间】:2011-11-18 01:53:30
【问题描述】:

必填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 模板的 {{each}} 运算符运行相同的字符串数组时,它会将其视为 chars 的二维数组。

<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

【问题讨论】:

    标签: jquery jquery-templates


    【解决方案1】:

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

    这会给你想要的结果(或多或少):

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

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

    http://jsfiddle.net/wuEyp/11 将使用函数重新添加索引。出于某种原因,我无法正确使用闭包。

    【讨论】:

    • 请记住,模板是一个隐式循环。您原来的{{each}} 循环遍历每个字符串中的每个字符——模板 循环遍历数组中的每个字符串。
    • jsfiddle.net/wuEyp/11 将重新添加索引。由于某种原因,我无法通过闭包正确完成......
    • 我认为您的第一条评论是问题的实际答案(仍在确认中)。只需编辑您自己的答案并将您的 cmets 放在那里,我可能最终会接受它。
    • 我肯定会认为这个问题很好,并开始一个比这更具体的新问题。我的问题是递归 {{each}} 模板(基本 JS 反射)在字符串数组上过于深入。我只需要弄清楚如何在此类数组上简化递归。这就是我试图删减到足以呈现问题的结果:问题的答案,但不是我的问题。 :P
    • 如果你碰巧有办法避免这个隐式循环,现在有一个follow-up question
    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多