javascript - 加载模板时在模板内触发 JavaScript?

标签 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>

这是模板绑定(bind):

<span data-bind="template: 'template1'"></span>

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

我怎样才能做到这一点?

最佳答案

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

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

关于javascript - 加载模板时在模板内触发 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20860983/

相关文章:

node.js - 带有 Redis 消息队列的 NodeJS - 如何设置多个消费者(线程)

Javascript RegEx 检测浏览器

javascript - 随机设置背景图片

javascript - 如何字符串替换数组中的符号并拆分?

jquery - <div> 相对于 div 信封右下角的位置

javascript - 在包含另一个函数的函数上返回 false

xmpp - 如何管理在 XMPP 中离线时发送的 PubSub 通知?

java - 来自不同类的 Jedis PubSub

javascript - JavaScript中如何测试字符串是否为0或正整数?

javascript - AJAX 添加新元素后更新 Javascript 事件监听器