MVVVMでモーダルを操作する別の方法を提案したいと思います。MVVMでは、ViewModelはビューのデータであり、ビューはUIを担当します。この提案を検討すると、次のようになります。
this.detailedEmployee = ko.observable({}),
var self = this;
this.showDetails = function(employee){
self.detailedEmployee(employee);
$("#dialog").dialog("show"); //or however your dialog works
}
私は強く同意しthis.detailedEmployee = ko.observable({})
ますが、私はこの行に強く反対しています:$("#dialog").dialog("show");
。このコードはViewModelに配置され、モーダルウィンドウを表示します。実際、これはViewの責任であるため、MVVMアプローチを台無しにします。このコードは現在のタスクを解決すると思いますが、将来的には多くの問題を引き起こす可能性があります。
- ポップアップを閉じるときは、メインのViewModelが一貫した状態になるように設定
detailedEmployee
する必要があります。undefined
- ポップアップを閉じるときに、アプリケーションで別のモーダルのコンポーネントを使用するときに、検証と閉じる操作を破棄する可能性が必要になる場合があります
私の場合、これらの点は非常に重要なので、別の方法を提案したいと思います。ポップアップにデータを表示する必要があることを「忘れた」場合、バインディングwith
によって問題が解決する可能性があります。
this.detailedEmployee = ko.observable(undefined);
var self = this;
this.showDetails = function(employee){
self.detailedEmployee(employee);
}
<div data-bind="with: detailedEmployee">
Data to show
</div>
ご覧のとおり、ViewModelはデータの表示方法について何も知りません。表示する必要のあるデータについてのみ知っています。with
バインディングは、が定義されている場合にのみコンテンツを表示しますdetailedEmployee
。with
次に、ポップアップにコンテンツを表示するのと同様のバインディングを見つける必要があります。名前を付けましょうmodal
。そのコードは次のようになります。
ko.bindingHandlers['modal'] = {
init: function(element) {
$(element).modal('init');
return ko.bindingHandlers['with'].init.apply(this, arguments);
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
var returnValue = ko.bindingHandlers['with'].update.apply(this, arguments);
if (value) {
$(element).modal('show');
} else {
$(element).modal('hide');
}
return returnValue;
}
};
ご覧のとおり、with
プラグインを内部で使用し、バインディングに渡された値に応じてポップアップを表示または非表示にします。定義されている場合-'show'。そうでない場合-'非表示'。その使用法は次のようになります。
<div data-bind="modal: detailedEmployee">
Data to show
</div>
あなたがする必要がある唯一のことはあなたの好きなモーダルプラグインを使うことです。Twitter Bootstrapポップアップコンポーネントを使用して例を準備しました:http://jsfiddle.net/euvNr/embedded/result/
この例では、カスタムバインディングはもう少し強力です。onBeforeCloseイベントをサブスクライブし、必要に応じてこのイベントをキャンセルできます。お役に立てれば。