Я строю нокаута \ JQuery плагин, который создает свой собственный пользовательский интерфейс, когда вызывается, например, так:Rendering шаблон нокаута с JQuery после загрузки страницы
<input type="text" name="filter" id="filter" />
// renders ui
$("#filter").myPlugin();
Обычная Jquery вещи. Однако, как часть поведения, я хочу использовать шаблоны нокаута. Кажется, что этот нокаут распознает только шаблоны, которые находятся на странице при первой загрузке.
Вот краткий пример, который показывает проблему:
<div id="container">
<div data-bind="template: { name: 'fieldsTemplate', foreach: FilterRows() }">
</div>
</div>
И в ЯШ:
var fieldstemplate = $('<script>', { type: "text/html", id:"fieldsTemplate" });
var row = $('<ol>').html("<li>row</li>").appendTo(fieldstemplate);
fieldstemplate.insertAfter($("#container"));
var model = { FilterRows: ko.observable(["row"]) };
ko.applyBindings(model);
Это производит следующее сообщение об ошибке:
Uncaught TypeError: Cannot read property 'length' of null knockout-2.2.1.js:8
Я также создал JS скрипка проблемы здесь: http://jsfiddle.net/roysvork/EcFRc/
Bascially Мне интересно, нужно ли мне использовать другой подход здесь, или если есть способ, я могу «разобрать» дом, чтобы обновить знания нокаутов о шаблонах?
Заранее благодарен!
Вы можете, конечно, используйте альтернативный метод загрузки шаблона, но просто хотел упомянуть, что для вашей исходной проблемы это действительно связано с тем, как вы устанавливаете содержимое элемента 'script'. Вы хотели бы использовать 'text' для установки содержимого, например: http://jsfiddle.net/rniemeyer/uWbQt/. Ошибка заключается не в том, что он не может найти шаблон, а потому, что он считает, что шаблон не имеет содержимого. Надеюсь, это поможет. –
Ahh блестящий, спасибо Райан. Кажется, в конце концов другая нить немного переборщила! Это было интересное приключение в работе механизма шаблонов, по крайней мере. –