いくつかの問題があるようです:
まず、isOpen
ウィジェットがいっぱいになる前にサブスクリプションが実行されています。
第 2 に、ウィジェットを埋めた後、データソースが更新され、ウィジェットを含むモデルをシリアル化しようとするため、問題が発生します。これは最終的に、Knockout-Kendo がグリッドに渡されたデータのアンラップについて少し積極的すぎるためです。
この問題を解決するには、2 つの非常に簡単な方法があります。open
最も簡単な方法は、ウィジェットのイベントのグローバル ハンドラーをセットアップし、その上でセンターをコールすることです。
これをclose
前の質問のイベントと組み合わせると、次のようになります。
ko.bindingHandlers.kendoWindow.options = {
close: function() {
$('.k-window, .k-overlay').remove();
},
open: function(event) {
event.sender.center();
}
};
これで、ウィンドウが開かれるたびに中央に配置され、ウィジェットをいじる必要がまったくなくなりました。サンプルはこちら: http://jsfiddle.net/rniemeyer/F4JGG/
それが最良の選択肢のようです。ウィジェット自体への参照で機能させるには、ライブラリの問題を回避する必要があります。前述のように、これは少し積極的すぎてオプションをアンラップしているため、ウィジェットが初期化され、ウィジェット パラメーターが渡され、既にウィジェットで満たされている場合に問題が発生するようです。機会があれば、図書館で取り上げることができるはずです。
それ以外の場合は、次のことを行う必要があります。
self.popUpWindow = ko.observable();
self.popUpWindow.subscribe(function (widget) {
if (widget) {
widget.center();
self.popUpWindow(null); //hack - Knockout-Kendo should handle this one
}
});
したがって、呼び出した後にオブザーバブルをクリアしcenter
てください。ここにサンプルがあります: http://jsfiddle.net/rniemeyer/PVMjy/。isOpen
上記 のタイミングの問題がないように、ウィジェットのオブザーバブル自体もサブスクライブしました。
この場合、グローバルopen
ハンドラを設定するのが最もクリーンで最適なオプションのようです。