2011-12-31 7 views
3

私はこのように私のページを取り込む "動的" 午前:Knockoutjs:動的なコンテンツとapplyBindings

<script type="text/html" id="ContainerTemplate"> 
    <span data-bind="template: { 
        name: contentTemplate, 
        data: contentData }"></span> 
</script> 

<script type="text/html" id="fooTemplate"> 
    <span data-bind="text: barAttribute"></span> 
</script> 

<button data-bind="click: complete">complete</button> 

Hello 
<span data-bind="template: { name: 'ContainerTemplate', foreach: myContents }"></span> 
! 

のViewModel:

var viewModel = { 
    myContents: ko.observableArray([]), 
    complete: function() { 
     viewModel.myContents.push({ 
      contentTemplate:'fooTemplate', 
      contentData:{barAttribute:'world'}}); 
    } 
}; 

ko.applyBindings(viewModel); 

特殊性は、テンプレート名が動的であるということです。それは(あなたはhttp://jsfiddle.net/hPQNx/でそれを試すことができます)のように動作するようですが、私は正しくやっているのだろうかと思う。ルートや親などの一部のテンプレート機能は動作していないようです。

applyBindingsを手動で再呼び出しする必要がありますか?これは関連するDOMノードで行う必要がありますが、セットアップでこれらのノードにアクセスするにはどうしたらよいですか?

答えて

3

あなたのビューモデルにプロパティを追加し、ルートプロパティを追加して$root$parentという参照を使ってこのプロパティを参照する方法を示しました。実際

var viewModel = { 
 
    a: ko.observable('foo'), 
 
    myContents: ko.observableArray([]), 
 
    complete: function() { 
 
     viewModel.myContents.push({ 
 
      contentTemplate: 'fooTemplate', 
 
      b: 'goo', 
 
      contentData: { 
 
       barAttribute: 'world' 
 
      } 
 
     }); 
 
    } 
 
}; 
 

 
ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/2.0.0/knockout-min.js"></script> 
 
<script type="text/html" id="ContainerTemplate"> 
 
    <span data-bind="template: { 
 
        name: contentTemplate, 
 
        data: contentData }"></span> 
 
</script> 
 
     
 
<script type="text/html" id="fooTemplate"> 
 
    <span data-bind="text: barAttribute"></span> 
 
    <div data-bind="text: $root.a"></div> 
 
    <div data-bind="text: $parent.b"></div> 
 
</script> 
 

 
<button data-bind="click: complete">complete</button> 
 

 
Hello 
 
<span data-bind="template: { name: 'ContainerTemplate', foreach: myContents }"></span> 
 
!

+0

。私はフィドルの中でそれをテストしなかったのは残念だ。私の前提は、ダイナミックテンプレートのためだと思いましたが、古いバージョンのKnockoutjs(1.2.1)があるのでこれが可能でしょうか?バージョン管理されたドキュメント、またはそれを確認できる機能的な変更ログはありますか? – Gnurfos

+2

1.2.1は、$ root、$ parent、$ parents(またはjQueryテンプレート外の$ data)をサポートしていません。これらのコンテキスト変数は2.0で追加されました。 –

+2

@Gnurfos - それは正しいです。これらの機能はKO 2.0.0まで追加されませんでした。 KO 2にはいくつかの大きな変更点がありました。私には全く違うのは、以前のバージョンではイベントハンドラが最初のパラメータとしてDOMイベントオブジェクトを受け取ったということだけでした。 KO v2では、イベントハンドラは最初のパラメータとしてモデルを受け取り、2番目のパラメータとしてDOMイベントオブジェクトを受け取ります。 DOMイベントオブジェクトを使用するKOコードを変更して、2番目のパラメータとして考慮する必要があります。 // KO 1.2以降 myViewModel.myEventHandler =機能(EVT) // KO v2の myViewModel.myEventHandler =機能(データ、EVT) –

関連する問題