【Ext JS】DataStoreの謎 続き
2009.06.22 Author: 殺伐
じめじめした名古屋からこんにちは。先日の「【Ext JS】DataStoreの謎」のエントリーが気になって土日に調べてみました。 Extを触るのは初めてなので、まずはファイル全体の構成から確認・・・素人の私には難しすぎます。 なんとかalertを仕掛けまくったりしてExtのソースを追いかけてみました。
やはり、データ構築のタイミングの問題だとわかりました。
どういうことかと言うと、下記ソースの
dsCategory.each(function(rec){
rec.set('is_select' , testArray[index]);
index++;
});
rec.setメソッドを呼び出すと、dsCategoryオブジェクトが保持している、グリッドの内容と更新後の値を比較し、同じ内容ならば何もせず、異なっていれば新しいHTMLを生成してテーブルに流し込むという動作をしている様ですが、この時グリッド自体はまだ構成されていない為、流し込んだHTMLがテーブルの最初の行に生成されてしまう為、dsCategoryが持っているデータの順番と、実際のHTMLの順番がずれてしまうというわけです。
javascriptエラーの"this.getRow(c) is undefined"ですが、getRowメソッドは該当のテーブルのc行目のRowをgetする(そのまんま・・・)メソッドです。このメソッドが呼ばれる場所はrefreshRowメソッドの内部で
this.getRow(index).rowIndex = index ;
と言う処理をする箇所ですが、前述の様にHTML流し込み時に行がずれてしまい、存在しない順番のRowを返し(=未定義値が返る)ます。すると、未定義値に対し".rowIndex"の参照をしてしまうため、エラーになる・・・と言うわけですね。
さて、このエラーを回避する方法ですが、
前回の書き込み追記に記載が書いてあるように、グリッド構築後に実施する事です。
どうしてもグリッド構築前にsetしたい!と言う方は・・・
var testArray = [ null , true , null ,true , null ] ;
あまりスマートではありませんが、falseの代わりにnullでも入れて下さい。
データの更新かどうか判断する条件分岐時に、更新が必要と判断されHTMLを流し込んでくれます。
たぶん。