2016-08-25 13 views
0

ページビューモデルからネストされたコンポーネントのビューモデルにアクセスしようとしています。

これはテンプレートである:

<collapse-panel> 
    <custom-component data-bind="viewModel: $root.customComponentVM"> 
    </custom-component> 
</collapse-panel> 

テンプレート崩壊パネルコンポーネントのカスタム・コンポーネントで

<div class="collapse panel-collapse" data-bind=" 
    template: { nodes: $componentTemplateNodes }"> 
</div> 

、私はカスタムは、以下typescriptですコードを使用して、ビューモデル命名結合加え:

ko.bindingHandlers["viewModel"] = { 
    init: (element: any, 
     valueAccessor:() => KnockoutObservable<any>, 
     allBindingsAccessor: KnockoutAllBindingsAccessor, 
     viewModel: any, 
     bindingContext: KnockoutBindingContext): void => { 
     valueAccessor()(viewModel); 
    } 
}; 

私の問題は、init関数shのviewModelオブジェクトouldはCustomElementVMですが、代わりにCollapsePanelVMを取得します。

これはinitメソッドにブレークポイントを追加するときに私が得るものです:

element    //the expected custom-element 
viewModel   //the incorrect CollapsePanelVM 
ko.dataFor(element) //also returns the incorrect CollapsePanelVM 

私はまた、次の構文を使用してカスタム要素を結合しようとしている:

<div data-bind="component: {name: 'custom-component' ... 

も結合ノックアウトコメント構文も使用する$ componentTemplateNodes:

<div class="collapse panel-collapse"> 
    <!-- ko template: { nodes: $componentTemplateNodes } --><!-- /ko --> 
</div> 

私は間違ったviewModelを取得します。私はここで何か間違っているのですか、これはノックアウトのバグですか?おかげさまで

+0

あなたが探している 'viewModel'を' valueAccessor() 'で返してはいけませんか?パラメータを介したノックアウトによって提供される 'viewModel'は、データバインドがバインドされた' $ data'を参照します。 – user3297291

+0

valueAccessor()は、ノックアウト観測値を返す縮小されたjs関数を返します。残念ながら、私が探しているビューモデルではありません。ありがとう – skety

答えて

1

collapse-panelコンポーネントのコンテキストでバインディングハンドラが実行されています。その理由は、の内部にあるためです。タグのコンテキストは、タグ自体にではなく、タグ自体には適用されません(例えば、ifのバインディングの仕組み - タグは常に存在しますが、その内容はそうではありません)。

バインディングをcustom-componentというコンテキストで実行する場合は、そのバインディングをテンプレートのタグcustom-componentに設定します。

親がコンポーネントのビューモデルを設定できるようにするには、use paramsとする必要があります。

params - コンポーネントに渡されるオブジェクト。通常 これは複数のパラメータを含むキー値オブジェクトであり、コンポーネントのviewmodelコンストラクタによって通常受け取られる です。

+0

このコンポーネントは同じページで複数回使用されるため、残念ながらカスタムコンポーネントテンプレートにバインディングを追加できません。彼らはお互いに葛藤するだろう。子ノードに正しいコンテキストを適用するために、 'foreach:$ componentTemplateNodes、as: 'item''の後に'

'のようなものが続く方法がありますか? – skety

+0

@sketyコンポーネントに 'params 'を渡したいと思うように聞こえます。コンポーネントのviewmodelコンストラクタ内で、 'params'を使ってVMをカスタマイズすることができます。これにより、ビューモデルバインディングハンドラが不要になることがあります。 –

+0

私は、ページのビューモデルをパラメータに渡し、コンポーネント自体をそれに登録させることができると思います。あなたはうまくいくはずです。どうもありがとう。 – skety

関連する問題