之前我使用过Knockout模板,所以我不确定为什么这对我不起作用。 我尝试了两种不同风格的ko标记,但都没有工作。
<!-- more nesting levels -->
<div class="cal-day-tps" data-bind="foreach: timePeriods">
<div class="cal-day-tp-cont">
<div data-bind="template: { name: 'tp-ed-templ', data: $data }"></div>
//both of these methods fail
<!-- ko template: { name: 'tp-ed-templ', data: $data } -->
<!-- /ko -->
</div>
</div>
<!-- /more nesting levels -->
<script type="text/html" id="tp-ed-templ">
<!-- bunch of markup -->
</script>
我刚收到错误“无法找到ID为tp-ed-templ的模板”。
可能只是一个错字,但我找不到它。
这似乎是Durandal的一个问题,而不是Knockout 。
我在vanilla durandal设置中尝试了一些非常简单的案例,它仍然做同样的事情。甚至尝试将脚本放在与绑定相同的嵌套位置,没有骰子。
答案 0 :(得分:10)
简短回答:您目前无法使用 Durandal中的Knockout模板。
但是,正如 nemesv 指出的那样,如果您将命名模板放在Durandal之外,那么ko就能找到它们。例如,<div id="applicationHost"></div>
元素之外的任何位置。
其他解决方法是使用Durandal的撰写功能,或者只是将模板内联为匿名。
在不久的将来可能会支持Knockout模板。
我终于在Durandal google小组上挖出了这些答案,
答案 1 :(得分:2)
问题是在绑定Durandal视图之前,KO模板元素必须存在于DOM 中。这是因为视图在插入到之前被绑定到DOM中,因此任何包含的模板都无法通过ID解析。
使用返回 observable 的函数可用于以后重新触发模板绑定..它可以工作,但是很难用。 (if
绑定可用于类似的效果。)
// bind to this in markup:
// <div data-bind="template: {name: $root.templateName, .. }">
vm.templateName = function () {
return vm.TemplateId();
};
// Changing this will trigger an observable in the KO template binding;
// don't ask me why we have to pass in a function to 'name' ..
vm.TemplateId = ko.observable("dummy-template-id-that-exists");
// After the view is attached the correct template element is in the DOM
// so we can trigger the template to (re-)bind and it will find it.
function viewAttached () {
vm.TemplateId("the-real-template-id");
}