【问题标题】:Recursive jQuery Templates with custom functions causing stack overflow?具有导致堆栈溢出的自定义函数的递归 jQuery 模板?
【发布时间】:2011-09-02 14:57:16
【问题描述】:

我正在创建一个 jQuery 模板系统,它会根据需要递归调用相同的模板。大多数“递归”模板的示例实际上只是调用其他模板的模板,甚至是pass around the $item object to retain custom functions 的模板。在这种情况下,我想使用原始 $data(AKA $item.data)的子部分调用相同的模板,同时还传递传递给原始 tmpl 调用选项的自定义模板函数。

// original template call
$("#someTemplate").tmpl(data, {
    someFunction1: function(itemToCheck) {
        return itemToCheck.p3;
    },
    someFunction2: function(itemToCheck) {
        return itemToCheck.p1 + ", " + itemToCheck.p2;
    }
}).appendTo(".results");

<!--in-template secondary call-->
{{tmpl($data.sub, $item) "#someTemplate"}}

Full code jsFiddle

似乎将$item 作为递归调用的选项参数传递会导致数据参数被忽略,可能是因为$item.data 包含原始对象并且它只是覆盖了新的数据参数。结果,在每个递归级别,我仍然在对象中的原始调用者级别进行操作,并且在对象结构中没有进一步的进展(因此出现堆栈问题)。

我需要使用$item 的其他属性来仅传递自定义函数而不让$item.data 覆盖传入的模板数据吗?

更新

您绝对不能只将$item 作为选项参数传递给{{tmpl}}。在looking at the code 之后,它将data 设置为新的模板调用,然后在几行之后将其与原来的$item.datajQuery.extend 一起吹走。

【问题讨论】:

    标签: jquery-templates


    【解决方案1】:

    虽然我似乎无法在 $item 上找到包含所有自定义函数的变量,但我能够通过从原始 $item 对象中单独传入每个自定义函数来解决此问题。不理想,但可以。

    {{tmpl($data.sub, { someFunction1: $item.someFunction1, someFunction2: $item.someFunction2 }) "#someTemplate"}}
    

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 2011-02-26
      • 2020-03-06
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多