模板加载时在模板中激活javascript?

时间:2013-12-31 17:22:49

标签: javascript jquery publish-subscribe

我正在使用此功能(在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>

我确实看到了“测试”元素,但它从不会触发警报。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

模板中的JS将在模板的HTML转换为DOM元素时运行。加载模板时,您不会将DOM作为DOM元素添加到DOM中 - 您将其作为文本添加到<script type="text/html">中。浏览器不会将模板中的代码“看到”为可运行代码,因为它尚未对其进行解析。当您实际渲染模板,使用它生成代码(使用KO,下划线或者有什么)时,就会发生这种情况。

更新:看来这是Knockout的限制:模板内的脚本标签会在执行时插入。您可以使用另一个模板引擎(或简单地使用jQuery来呈现模板)在渲染时执行脚本。