0

RPNiemeyerの剣道ノックアウトライブラリを使用しています。私は剣道の窓を持っています:

HTML:

<div data-bind="kendoWindow: {isOpen: isOpen, title:'Language', width: 400, height: 200, modal: true, widget: popUpWindow }" > 

ウィンドウを中央に配置するJavaScript部分:

this.popUpWindow = ko.observable();
    self.isOpen.subscribe(function (newValue) {
        if (newValue) {
            self.popUpWindow().center();
        }
    });

私は私のフィドルのために私の前の質問からのソースコードを使用しています:

剣道ノックアウト:ウィンドウが正しく閉じない

私はここに示されている手順に従っています:

剣道-ノックアウト:ウィンドウを中央に配置する方法

監視可能なウィジェットを定義していますが、それを使用したい場合、実際のウィジェットで埋められていません。

フィドル: http: //jsfiddle.net/dcYRM/15/

実例の助けがあれば大歓迎です。

4

1 に答える 1

3

いくつかの問題があるようです:

まず、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ハンドラを設定するのが最もクリーンで最適なオプションのようです。

于 2013-01-08T14:48:31.163 に答える