KO找不到带ID的模板

时间:2013-03-28 18:04:52

标签: javascript knockout.js durandal

之前我使用过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设置中尝试了一些非常简单的案例,它仍然做同样的事情。甚至尝试将脚本放在与绑定相同的嵌套位置,没有骰子。

2 个答案:

答案 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");
}