Javascript KO找不到ID为的模板

Javascript KO找不到ID为的模板,javascript,knockout.js,durandal,Javascript,Knockout.js,Durandal,我以前使用过敲除模板,所以我不确定为什么这对我不起作用。 我尝试了两种不同风格的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

我以前使用过敲除模板,所以我不确定为什么这对我不起作用。 我尝试了两种不同风格的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 temp的模板”

可能只是打字错误,但我一直找不到

  • 我在Durandal的上下文中使用KO,尽管这不会有什么区别
  • 尝试在使用前声明模板,但没有帮助
这似乎是Durandal的问题,而不是淘汰赛


我在香草durandal设置中尝试了一些非常简单的案例,它仍然做同样的事情。甚至尝试将脚本放在与绑定相同的嵌套位置,没有骰子。

简短的回答:您当前不能在
Durandal内部使用敲除模板。 然而,正如所指出的,如果将命名模板放在Durandal之外,ko就能够找到它们。例如,
元素之外的任何位置

其他解决方法是使用Durandal的compose功能,或者只是以匿名方式内联模板

淘汰模板可能在不久的将来得到支持

我终于在Durandal google group上找到了这些答案


问题是,在绑定Durandal视图之前,DOM中必须存在KO模板元素。这是因为视图在插入DOM之前已绑定,因此任何包含的模板都无法通过ID解析

使用返回可观察值的函数可用于稍后重新触发模板绑定。。它能工作,但不可靠。(可以使用
if
绑定来实现类似效果。)

//在标记中绑定到此文件:
//   
vm.templateName=函数(){
返回vm.TemplateId();
};
//更改此选项将触发KO模板绑定中的可观察项;
//不要问我为什么我们必须将函数传递给“name”。。
vm.TemplateId=ko.observable(“存在的伪模板id”);
//附加视图后,正确的模板元素位于DOM中
//因此,我们可以触发模板(重新)绑定,它会找到它。
函数视图已附加(){
TemplateId(“真正的模板id”);
}

调用您的
ko.applyBindings()
的位置在哪里?是的,我们可以看到更多的代码吗?JSFIDLE?在没有看到更多代码的情况下,我能想到的唯一一件事是在整个DOM加载并准备就绪之前调用绑定。如果您将命名模板放在Durandal之外的index.cstml中。它会起作用,KO可以在那里找到它。我之前也有同样的问题,并被建议仔细研究使用Durandal的ko.compose绑定来完成我的任务。我发现ko.compose满足了我的大部分模板制作需求,并且与Durandal的工作非常顺利。你只需指定一个模板名(我认为Durandal将其视为一个区域名),合成引擎就会加载html并将其绑定到当前模型。你是对的,先生,我错了。我不知道你不能在视图中使用模板。
// 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");
}