単純なモデルとビュー モデルがあるとします。
// Model
function Model(prop) {
this.Prop = ko.observable(prop);
}
// View Model
function ViewModel(){
var self = this;
this.CurrentItem = ko.observable(new Model("abc"));
this.Edit = function(){
$(#"EditDiv").dialog("show");
}
}
次に、html:
<body>
<input type="button" data-bind="click: Edit"/>
<div id="EditDiv" data-bind="with: CurrentItem">
<input type="text" data-bind="value: Property" />
</div>
</body>
次に、ページの下部にあるスクリプト:
$(document).ready(function(){
$("#EditDiv").dialog({ /* settings to hide it first. */ });
ko.applyBindings(new ViewModel());
});
上記のコードは機能し、「abc」というテキストを含むテキスト ボックスを含む jQuery ウィンドウをポップアップ表示します。
ただし、ページを div に分割し、各 div に異なるモデル ビューを割り当てると、バインディングが壊れます。
<body>
<div id="ForAnotherBindingContextDiv">
</div>
<div id="TargetContextDiv">
<input type="button" data-bind="click: Edit"/>
<div id="EditDiv" data-bind="with: CurrentItem">
<input type="text" data-bind="value: Property" />
</div>
</div>
</body>
そこで、バインディングを次のように変更します。
ko.applyBindings(new ViewModel(), $("#TargetContextDiv")[0]);
上記でも編集ウィンドウがポップアップしますが、テキスト ボックスは空です。私には、.dialog("show") を呼び出すときに jQuery がダイアログの設定全体をドキュメントのルート レベルに配置するため、バインディングが壊れているように見えますViewModel
。
jQuery には、ダイアログ全体の修正をルート レベルに配置しないオプションがありますか? 私が取ることができる別のアプローチはありますか?(カスタム バインディング ルートも試しましたが、どちらもバインドしませんでした。エラー メッセージ テキストのように、そのような div の内容が (バインディングなしで) 静的である場合に機能します)。