我正在使用此功能(在SO上找到)来加载模板:
var loadTemplates = function (list) {
var deferred = new $.Deferred();
var loadedTemplates = [];
ko.utils.arrayForEach(list, function (name) {
$.get("templates/" + name + ".html", function (template) {
$("body").append("<script id=\"" + name + "\" type=\"text/html\">" + template + "<\/script>");
loadedTemplates.push(name);
if (list.length === loadedTemplates.length) {
deferred.resolve(true);
}
});
});
return deferred.promise();
}
以下是我如何称呼它:
loadTemplates(['template1','template2']).then(function () {
$.publish("templates_loaded");
})
我已经成功订阅了我包含的js文件中的templates_loaded,但现在我想在模板中包含一些js。这就是我所拥有的:
<div id="test" data-bind="text: alarmIDs().length">Test</div>
<script>
$.subscribe("templates_loaded", function () {
alert('test');
});
</script>
这是模板绑定:
<span data-bind="template: 'template1'"></span>
我确实看到了“测试”元素,但它从不会触发警报。
我该如何做到这一点?
答案 0 :(得分:0)
模板中的JS将在模板的HTML转换为DOM元素时运行。加载模板时,您不会将DOM作为DOM元素添加到DOM中 - 您将其作为文本添加到<script type="text/html">
中。浏览器不会将模板中的代码“看到”为可运行代码,因为它尚未对其进行解析。当您实际渲染模板,使用它生成代码(使用KO,下划线或者有什么)时,就会发生这种情况。
更新:看来这是Knockout的限制:模板内的脚本标签会在执行时插入。您可以使用另一个模板引擎(或简单地使用jQuery来呈现模板)在渲染时执行脚本。