2012-03-15 21 views
1

ウィジェットベースのアプリケーションを開発したシナリオがあります。これは、アプリケーションを使用するのDOMに自身を挿入します。このウィジェットはKnockoutJSを使用して独自のUIをレンダリングし、独自のViewModelをバインドします。KnockoutJS二重バインディングウィジェットアプリケーション

のかかるアプリケーション(おそらくない鉱山)も全く違うのViewModelでそれ自身のUIをレンダリングするためにKnockoutJSを使用しています。何が起こる

は、その消費ページがロードされ、ko.applyBindings(hostPageViewModel)を実行します。その後、ウィジェットはko.applyBindings(widgetDataViewModel)をロードして実行します。 2番目のapplyBindingsが実行されると、消費ページはそのバインドされたモデルのコンテキストを失い、何も表示しません。デバッグでは、消費しているアプリケーションでレンダリングされたデータを確認してから、ウィジェットアプリケーションでデータを消去します。

ノックアウトの全く異なる2つのインスタンスを維持しようとする以外にも(これが可能かどうかは確かではありませんが、私はウィジェットのバージョンを新しくしてkotwoと呼ぶことを考えていました)、これには解決策がありますか?

このデザインのアプリケーションスタイル内のアプリケーションのため、バインドは1回だけ適用できません。

誰かが提案している場合、私はこの1つの助けが大好きです。

+0

私はちょうど私が存在を知らなかったどの[http://stackoverflow.com/questions/7342814/knockoutjs-ko-applybindings-to-partial-view]これを見つけました。あなたがバインディングをスコープすることができるように聞こえますが、私はこれがそれをするかどうかはわかりません。これに関する文書はないようです。私は、ウィジェットのアプリはそれがrootであればapplyBindingsを落とすことができ、これが動作すれば何らかのアプリを使用しているものから完全に分離することができると思います。 – farina

+0

よろしくお願いします。 KnockoutJSのルートノード機能は、私が必要とするものを正確に行います。これらの人が考えなかったことは何ですか?ノックアウトチームと仕事をする必要があります...素晴らしい! – farina

+0

問題をどのように解決したかを問題として投稿し、他のユーザーが正しく指示されるようにすることはできますか。 – madcapnmckay

答えて

3

私はあなたの第二だけで、あなたのウィジェットをロードした後、DOMに追加され、後のあなたの最初のapplyBindingsが呼び出され、ウィジェット含むdiv要素にバインディングを適用する範囲にする必要がありますと思います。

だから、ウィジェットは、彼らがお互いのつま先で踏む停止します

ko.applyBindings(widgetViewModel, $widgetDiv); 

これを呼び出します。

ページに2つのバージョンのKOを持つことについては、結果がどのようなものかわかりません。 koオブジェクトをテストできますか?見つからない場合は、ファイルを動的にインクルードしますか?

これが役に立ちます。

+0

私はKOの1つのバージョンを使用することを計画していました...必要に応じてインスタンス化するだけです。魔法は私が知らなかった余分なルートノードパラームが存在することにあります。 – farina