是否可以在KnockoutJS中使用外部模板?
<script type="text/html" id="a_template" src="templates/a_template.html">
</script>
我尝试过这个解决方案,但没有让它运转起来。
答案 0 :(得分:23)
您可以使用jquery将html动态加载到脚本元素中,然后根据它执行knockout。
<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>
你的敲除绑定必须在回调函数中完成,否则你有可能在页面加载之前尝试绑定
UPDATE 以下是我在jsfiddle上编写的示例,用于演示动态加载:http://jsfiddle.net/soniiic/2HxPp/
答案 1 :(得分:6)
答案 2 :(得分:4)
您也可以将此模板引导程序用于KO
引导程序 https://github.com/AndersMalmgren/Knockout.Bootstrap
MVC WebAPI演示 https://github.com/AndersMalmgren/Knockout.Bootstrap.Demo
它使用此over lib使用约定优于配置approuch https://github.com/AndersMalmgren/Knockout.BindingConventions
意味着它会自动理解 MyViewModel 应该匹配 MyView
它还准备在SPA中很好地工作
免责声明:我是上述3个库中的作者
答案 3 :(得分:2)
这是一个基于soniiic答案的小功能:
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>