我找到了加载外部模板的引擎,插件和函数,但我想知道是否有更简单的方法。像这样的东西?
templates.html
<script id="testTemplate" type="text/html">
<div>this is a div</div>
</script>
的index.html
<div id="templateContainer"></div>
<script>
$(document).ready(function() {
$("#templateContainer").load("templates.html");
}
</script>
这会有用吗?有没有“陷阱”?
答案 0 :(得分:28)
以下是我用来加载包含模板集合的模板文件的内容:
var loadTemplateCollection = function(file, success) {
$.get('templates/' + file + '.html', function(templates) {
$('body').append('<div style="display:none">' + templates + '<\/div>');
success();
});
};
以下是我使用此功能的示例:
self.loadPage = function () {
if (!self.isLoaded()) {
loadTemplateCollection('uploadwizard', function() {
self.isLoaded(true);
self.uploadWizard();
});
}
}
您的观点看起来像这样(if
很重要):
<div data-bind="template: {'if': isLoaded, name: 'uploadwizard', data: wizard}"></div>
答案 1 :(得分:6)
这是我用来加载新的页面视图。 我觉得使用非常简单:
var template = 'template.html';
var targetID = 'container';
var partialVM = {data : 1};
var load = function (template, targetID, partialVM) {
$.ajax(template, { async: false })
.success(function (stream) {
$('#' + targetID).html(stream);
ko.applyBindings(partialVM, document.getElementById(targetID));
}
);
};
但在我的html模板中,我没有脚本元素,只是一个简单的div作为根元素。
我希望它有所帮助。
答案 2 :(得分:2)
我创建了一个新的绑定来从url加载html并对其应用绑定
ko.bindingHandlers.htmlUrl = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
$(element).load(valueAccessor(), function () {
$(element).children().each(function (index, child) {
ko.applyBindings(bindingContext.$data, child);
});
});
},
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
}
};
使用
<div data-bind="htmlUrl : <url>">
</div>
答案 3 :(得分:1)
我终于能够在绑定处理程序的帮助下拼凑出一个懒惰的模板加载器。想分享。
延迟加载程序
markupLoader = {
templateDictionary: {},
loadMarkup: function (element, value, bindingContext) {
if (!this.templateDictionary[value]) {
this.templateDictionary[value] = $.get(value);
}
this.templateDictionary[value].done(function (template) {
$(element).html(template);
$(element).children().each(function (index, child) {
ko.applyBindings(bindingContext, child);
});
});
}
};
绑定处理程序
ko.bindingHandlers.htmlUrl = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
let value = ko.unwrap(valueAccessor());
markupLoader.loadMarkup(element, value, bindingContext);
return { controlsDescendantBindings: true };
}
};