【问题标题】:Using an external Template in KnockoutJS在 KnockoutJS 中使用外部模板
【发布时间】:2012-02-28 11:02:44
【问题描述】:

是否可以像这样在 KnockoutJS 中使用外部模板?

<script type="text/html" id="a_template" src="templates/a_template.html">
</script>

我已经尝试过这个解决方案,但没有成功。

【问题讨论】:

标签: templates knockout.js external knockout-templating


【解决方案1】:

您可以使用jquery将html动态加载到脚本元素中,然后在此基础上执行敲除。

<script type="text/html" id="template_holder"></script>
<script type="text/javascript">
$('#template_holder').load('templates/a_template.html', function() {
  alert('Load was performed.');
  //knockout binding goes here
});</script>

您的淘汰绑定必须在回调函数中完成,否则您可能会在页面加载之前尝试绑定

更新这是我在 jsfiddle 上编写的一个示例,用于演示动态加载:http://jsfiddle.net/soniiic/2HxPp/

【讨论】:

  • 谢谢,但我认为外部模板引擎更好一些,因为它隐藏了所有请求。
  • 好的 :) 但请记住,用户仍然可以看到请求:code.google.com/chrome/devtools/docs/network-files/…
  • 这是一个很好的解决方案。下面是一个 div 模板占位符的敲除绑定示例:ko.applyBindings(myViewModel, $('#template_holder')[0]);
【解决方案2】:

【讨论】:

  • 谢谢,这看起来很简单。
  • 在您的 HTML 文件中,引用 jQuery、jquery-tmpl(如果您使用的是 jquery 模板)、knockout.js、TrafficCop、infuser 和 koExternalTemplateEngine.js 文件 -它似乎不是很轻巧:)
  • 您也可以只引用 koExternalTemplateEngine_all.js,其中包括模板引擎、TrafficCop 和注入器。这三个库都是由 Jim 编写的,因为他认识到其中一些功能在 KO 之外很有用。
【解决方案3】:

您也可以使用此模板引导程序进行 KO

引导程序 https://github.com/AndersMalmgren/Knockout.Bootstrap

MVC WebAPI 演示 https://github.com/AndersMalmgren/Knockout.Bootstrap.Demo

使用这个库,它使用约定而不是配置方法 https://github.com/AndersMalmgren/Knockout.BindingConventions

意思是它会自动理解 MyViewModel 应该匹配到 MyView

它也可以在 SPA 中很好地工作

免责声明:我是上述 3 个库的作者

【讨论】:

    【解决方案4】:

    这里有一个基于 soniic 回答的小函数:

    function loadExternalKnockoutTemplates(callback) {
        var sel = 'script[src][type="text/html"]:not([loaded])';
        $toload = $(sel);
        function oncomplete() {
            this.attr('loaded', true);
            var $not_loaded = $(sel);
            if(!$not_loaded.length) {
                callback();
            }
        }
        _.each($toload, function(elem) {
            var $elem = $(elem);
            $elem.load($elem.attr('src'), _.bind(oncomplete, $elem));
    
        });
    }
    

    这将自动加载您文档上的所有剔除模板,前提是它们的 src 已设置并且它们的类型是“text/html”。传入一个回调以在所有模板加载时得到通知。不知道如果其中任何一个失败会发生什么。

    示例用法:

     <head>
        <script type="text/html" src="kot/template1.html" id="template1"></script>
    
    </head>
    <body>
        <script>
            $(function() {
                loadExternalKnockoutTemplates(function() {
                    // Put your ready code here, like
                    ko.applyBindings();
                });
            });
    
    
            function loadExternalKnockoutTemplates(callback) {
                var sel = 'script[src][type="text/html"]:not([loaded])';
                $toload = $(sel);
                function oncomplete() {
                    this.attr('loaded', true);
                    var $not_loaded = $(sel);
                    if(!$not_loaded.length) {
                        callback();
                    }
                }
                _.each($toload, function(elem) {
                    var $elem = $(elem);
                    $elem.load($elem.attr('src'), _.bind(oncomplete, $elem));
    
                });
            }
        </script>
    </body>
    

    【讨论】:

    • 非常聪明,但在您将 '.bind(oncomplete,$elem)' 替换为 'oncomplete.bind($elem)' 和 '.each' 之前,我不会赞成with 'ko.utils.arrayForEach' ;-) 还不需要添加下划线
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多