6

以前に Knockout テンプレートを使用したことがあるので、これがうまくいかない理由がわかりません。2 つの異なるスタイルの 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 のテンプレートが見つかりません」というエラーが表示されます。

おそらくただのタイプミスですが、私はそれを見つけることができませんでした。

ノックアウトではなく、デュランダルの問題のようです。

バニラデュランダルセットアップでいくつかの非常に単純なケースを試しましたが、それでも同じことが起こります. バインディングと同じネストされた場所にスクリプトを配置しようとしても、さいころはありません。

4

2 に答える 2

10

簡単な答え: 現在、 Durandal内でKnockout テンプレートを使用することはできません。ただし、nemesvが指摘したように、名前付きテンプレートを Durandal の外に置くと、ko はそれらを見つけることができます。たとえば、<div id="applicationHost"></div>要素の外側の任意の場所。

他の回避策は、Durandal の構成機能を使用するか、テンプレートを匿名としてインライン化することです。

ノックアウト テンプレートは、おそらく近い将来サポートされる予定です。

私は最終的にデュランダルのグーグルグループでこれらの答えを掘り起こしました。

于 2013-03-28T19:40:21.997 に答える
3

問題は、Durandal ビューがバインドされる前にKO テンプレート要素が DOM に存在する必要があることです。これは、ビューがDOM に挿入されるにバインドされているため、含まれているテンプレートを ID で解決できないためです。

オブザーバブルを返す関数を使用すると、後でテンプレートバインディングを再トリガーするために使用できます..動作しますが、不安定です。(バインディングを使用して同様の効果を得ることができます。)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");
}
于 2013-05-22T23:49:08.743 に答える