1

私は自分のグリッドに特別な実装をしています。
このために、 jqGridonSelectRowのコードとloadCompleteメソッドをいくつか書きました。

onSelectRowグローバル配列を更新する必要があり、メソッドloadCompleteではグローバル配列にアクセスする必要があり、jqGrid でいくつかの操作が必要です。

それまでは大丈夫です。私はすでにこれをしました。ここで、これらの 2 つのメソッドを、実装が汎用になるように拡張したいと考えています (他のグリッドは、コードを記述せずにこれを使用できます)。

そのために、以下の手順を考えました。

  1. jqGrid.js を使用して、html に新しい js (例: jquery.jqGrid.additional.js) を追加したい

  2. jqGridのデータ配列でグローバル変数を割り当てたい

  3. このjsではグリッドのマルチセレクトの値を確認したい

  4. 値が true の場合、onSelectRow、loadComplete メソッドを拡張して、jqGrid が私のメソッドと onSelectRow、loadComplete メソッドで記述されたコードの両方を実行するようにします。

たとえば、 メソッドの実行の直前と直後に実行する必要があるpreLoadCompleteandがあります。同様に、これは onSelectRow メソッドにも当てはまります。postLoadCompleteloadComplete

jquery.jqGrid.additional.js に以下のコードを書いたところ、jqGrid のロード後にアラート (1)、アラート (2) が表示されませんでした。

jqGrid の loadComplete メソッドに記述されたコードのみを実行します。

var oldLoadComplete = $.fn.jqGrid.loadComplete;

$.jqGrid.extend({
   loadComplete: function (){
      var ret;
      // do someting before
      alert(1);

      ret = oldLoadComplete.call (this);

      // do something after
      alert(3);

      return ret; // return original or modified results
   }
});

私はこれで多くのことを試し、何時間も費やしました。

4

1 に答える 1

1

$.jqGridではなく、を拡張しようとしてい$.fn.jqGridます。最初の行では、それ$.jqGridが存在しないことを意味し、すべての要素が変更された.jqGridプラグインにアクセスできないが、デフォルトにはアクセスできないことを意味します。

$.fn「新しい」追加メソッドで拡張しようとしましたが、機能しませんでした。これらのメソッドを明示的に上書きする必要がある場合があります。jQuery には、それ自体とメソッドに組み込まれたプラグインのためのいくつかの安全ルーチンがあると想像できます$.extend

var oldLoadComplete = $.fn.jqGrid.loadComplete;

$.fn.jqGrid.loadComplete = function( ) {
    alert('pre');
    var ret = oldLoadComplete.apply(this, arguments); // In case any arguments will be provided in future.
    alert('post');
    return ret;
};

編集:

そんなことは忘れてください。それは無関係です。GitHub で jqGrid のソース コードを少し調べたところ、jqGrid が$.fn.jqGrid.loadComplete. それはあなたが自分で作り上げたものです。代わりに、可能なプロパティとデフォルトのリストを提供する別のオブジェクトを作成します。このオブジェクトはカスタム デフォルトで上書きされ、最後に jqGrid への呼び出しで渡す関数パラメータで上書きされます。

jqGrid が 2 つのイベントjqGridLoadCompleteをトリガーし、loadComplete コールバックの呼び出しの前後に、jqGridAfterLoadComplete一致した要素のセット (つまり) をトリガーすることがわかりました。this

したがって、基本的に、あなたの試みは使用できません。代わりに、私の頭に浮かぶ唯一の解決策は$.fn.jqGrid、同じメソッドを使用してjqGridの「コンストラクター」(つまり)を上書きし、リスナーをthis次のように適用することです。

var oldJqGrid = $.fn.jqGrid;

$.fn.jqGrid = function( ) {
    this.on('jqGridLoadComplete', function( jqEvt ) {
            alert('Pre');
        })
        .on('jqGridAfterLoadComplete', function( jqEvt ) {
            alert('Post');
        });
    return oldJqGrid.apply(this, arguments);
};

あなたの複数選択について...あなたが何について話しているのかわかりません。私自身の時間は非常に限られており、今のところこれ以上の支援を拒否する必要があります。

心から。

于 2012-08-11T23:51:30.973 に答える