Подтвердить что ты не робот

Загрузить шаблон нокаута из внешнего файла без сложного движка?

Я нашел движки, плагины и функции для загрузки внешних шаблонов, но мне интересно, есть ли более простой способ сделать это. Что-то вроде этого?

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"?

4b9b3361

Ответ 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 };
    }
};