Загрузить шаблон нокаута из внешнего файла без сложного движка?
Я нашел движки, плагины и функции для загрузки внешних шаблонов, но мне интересно, есть ли более простой способ сделать это. Что-то вроде этого?
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>
Будет ли это работать? Есть ли какие-либо "gotchas"?
Ответы
Ответ 1
Вот что я использую для загрузки файла шаблона, который содержит коллекцию шаблонов:
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>
Ответ 2
Это то, что я использую для загрузки нового просмотра страницы.
Я думаю, что это довольно просто:
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-шаблонах у меня не было элемента script, просто простой div как корневой элемент.
Надеюсь, это поможет.
Ответ 3
Я создал новую привязку для загрузки html из url и применил привязку к ней
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>
Ответ 4
Наконец-то я смог собрать ленивый загрузчик шаблонов с помощью привязки обработчиков. Хотелось поделиться.
Lazy loader
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 };
}
};