【发布时间】:2013-06-10 10:47:51
【问题描述】:
我正在构建一个淘汰赛\jQuery 插件,它在调用时会创建自己的 UI,如下所示:
<input type="text" name="filter" id="filter" />
// renders ui
$("#filter").myPlugin();
常用的 jQuery 东西。但是,作为行为的一部分,我希望使用淘汰模板。虽然敲除似乎只识别第一次加载时页面中的模板。
这里有一个简明的例子来说明问题:
<div id="container">
<div data-bind="template: { name: 'fieldsTemplate', foreach: FilterRows() }">
</div>
</div>
还有js:
var fieldstemplate = $('<script>', { type: "text/html", id:"fieldsTemplate" });
var row = $('<ol>').html("<li>row</li>").appendTo(fieldstemplate);
fieldstemplate.insertAfter($("#container"));
var model = { FilterRows: ko.observable(["row"]) };
ko.applyBindings(model);
这会产生以下错误:
Uncaught TypeError: Cannot read property 'length' of null knockout-2.2.1.js:8
我还在这里创建了一个解决问题的 JS 小提琴:http://jsfiddle.net/roysvork/EcFRc/
基本上我想知道我是否需要在这里采取另一种方法,或者是否有一种方法可以“解析” dom 以刷新模板的淘汰赛知识?
提前致谢!
【问题讨论】:
-
您当然可以使用另一种加载模板的方法,但只想提一下,对于您的原始问题,这实际上与您设置
script元素内容的方式有关。您可能想使用text来设置内容,例如:jsfiddle.net/rniemeyer/uWbQt。错误不是因为找不到模板,而是因为它认为模板没有内容。希望对您有所帮助。 -
啊,太棒了,谢谢瑞恩。似乎另一个线程最后有点矫枉过正!至少,这是对模板引擎工作原理的一次有趣的冒险。
标签: jquery jquery-plugins knockout.js knockout-templating