2009-05-26 8 views
0

extjsActionボタンのハンドラは、次のコードを持つ関数を呼び出します。extjsGirdPanel.getView()。getRowClassが2回動作しません

Add: function() { 
     var window = Ext.getCmp('wndAdd'); 
     window.items.items[0].getStore().reload; 
     var Grid1 = Ext.getCmp('grdAll'); 

     var grdStore2 = Ext.getCmp('grid2').getStore(); 
     var i = 0; 
     var IDList = new Array(); 
     for (i = 0; i < grdStore2.data.length; i++) { 

       IDList[i] = 
       grdStore2.data.items[i].data['ID']; 

     } 

     Grid1.getView().getRowClass = function(record, index) { 

      if (IDList.contains(record.data["ID"])) { 
       return 'disabled-row'; 
      } 
     }; 

     window.show(); 

    } 

しかしgetRowClass機能は、最初のボタンのクリックで動作します。追加される行を無効にしません。

+0

あなたはいつgetRowClassを発射​​しますか?あなたは関数を作成しているようですが、実際には応答する必要はありません。 – Ballsacian1

答えて

1

はい、グリッドの設定時にgetRowClassが1回だけ呼び出されます。しかし、私はeverytimewindow.show()を発射する何かが発射されるのを望んだ。私はwindow.onshowイベントで以下のコードを使用しました。 FYI

for (var i = 0; i < Grid1.getStore().data.length; i++) { 
    var element = Ext.get(Grid1.getView().getRow(i)); 
    var record = Grid1.getStore().getAt(i); 
    if (IdList.contains(record.data.ID)) { 
     element.addClass('disabled-row') 
    } else { 
     element.removeClass('disabled-row') 
    } 
} 
0

詳細な情報を入力すると、適切な回答で回答を編集します。

いつgetRowClassを実行していますか?あなたは関数を作成しているようですが、実際には応答する必要はありません。

この関数はエラーが発生しましたか、まったく呼び出されませんか、まったく必要としませんか?

2

getRowClassは1回だけ割り当てる必要があります。呼び出す関数ではなく、行がレンダリングされるたびにグリッドによって内部的に呼び出される関数です。それをイベント処理関数内に割り当てるのではなく、アプリケーションレベルのどこかで(例えば、Grid1自体が最初に構成された場所が最も論理的な場所)、1つの時間に割り当てる必要があります。これは、あなたのAdd関数がどのように呼び出されているかによっては、あなたの問題かもしれませんが、これは明らかではありません。あなたがgetRowClass内のIDListに頼っているので、関数があるスコープ内にあるその変数への参照を持たなければならず、またアクセスする前にそれが有効であることを確認する必要があるでしょうそれ。

Grid1が再レンダリングされている場所も表示されません。上で説明したように、getRowClassは、行がレンダリングされるときにのみ実行されるため、コードに表示されていないGrid1をリフレッシュしない限り、getRowClassは決して呼び出されません。

+0

これは本当です。 getRowClassは、(再)レンダリング時にのみ実行されます。私は、ストアのリロード(関数の初めに呼び出される)は、グリッドのリフレッシュを行うべきだと思いますが、データが変更された場合にのみ(内部の加算はカウントされません)。 'window.items.items [0] .getStore()'と 'Ext.getCmp( 'grid2')。getStore()'が同じストアを返すかどうかは不明です。 – Thevs

+0

はい、グリッドの設定時にgetRowClassが1回だけ呼び出されていました。そして、私はwindow.showイベントが発生するたびに解雇されるものが必要でした。そこで、以下のコードをonWindowShowで使用しました。 (var i = 0; i user99322

1

私はあなたがあなたのために働く解決策を見つけたことをうれしく思いながら、私はあなたがまだgetRowClassを理解していません。一度だけ呼び出されることはありません。グリッドの行がいつでも再描画される(これはいつでもデータが変更されます)。コードが正しく設定されていないため、コード内で一度しか呼び出されませんでした。

私はあなたのユースケースを完全には理解していませんが、表示されているウィンドウに関係なく、グリッドの基礎となるデータが実際に変更された場合は、行ストライピングを変更する必要があります。 getRowClass関数を適切に設定すると、必要なときに自動的にグリッドが呼び出され、「うまく動作する」必要があります。特別なオーバーヘッドを追加するだけで、あなたの反復コードを書く必要はありません。

また、ちょうどFYI。 :)

+0

さて、行Grid1上のストライピングは、実際に別のグリッドのデータ変更に依存していました。私の場合、Idlistは変更され、それに応じてグリッド1の行クラスが変更されます。 – user99322

+1

Grid1は、別のグリッドで変更されたとしても、データを管理しているすべての基礎ストアに単純にバインドすると考えています。このようにして、getRowClassへの更新と呼び出しは、手動処理の必要なしに、期待どおりに実行されます。しかし、もう一度、あなたのために働く解決策があれば、それは最も重要なことです。 –

関連する問題