【Ext JS】DataStoreの謎

2009.06.19 Author: Jas

今日はExt JSを使用中に遭遇した不可解な現象について紹介します。
先に断わっておきますが、現象の説明だけで解決方法はわかりません。
(※原因と回避方法がひとつわかったので追記しました。)

まずは、下のようなシンプルな表を用意します。

category = [
  [1, 'category 1', false],
  [2, 'category 2', false],
  [3, 'category 3', false],
  [4, 'category 4', false],
  [5, 'category 5', false]
];

var cmCategory = [
{
header: ' ',
dataIndex: 'is_select',
width: 30,
renderer: function(val, x, rec) {
return (val == true)
? '<input type="checkbox" checked>'
: '<input type="checkbox">';
}
},{
header: 'カテゴリ',
dataIndex: 'category_name',
id: 'category_name'
}
];

dsCategory = new Ext.data.SimpleStore({
fields: [
{name: 'category_id', type: 'int'},
{name: 'category_name', type: 'string'},
{name: 'is_select', type: 'boolean'}
]
});
dsCategory.loadData(category);

gridCategory = new Ext.grid.GridPanel({
store: dsCategory,
columns: cmCategory,
renderTo: 'category_table',
height: 210,
width: 198
});

そして、each関数を用いて、データの更新処理を行うと・・・?

var testArray = [true, false, true, false, true];
var index = 0;
dsCategory.each(function(rec){
  rec.set('is_select', testArray[index]);
  index++;
});

trueとfalseを交互にセットしているだけです。
が、なぜかJavaScriptのエラー!?

'this.getRow(c) is undefined'ですって?
意味がわかりません。

試しにセットするデータを変えてみました。

var testArray = [true, true, true, false, false];
var index = 0;
dsCategory.each(function(rec){
  rec.set('is_select', testArray[index]);
  index++;
});

すると、問題なくデータの更新ができました。
変えたのはセットするデータだけなのになぜ?

trueとfalseが飛び石でセットするのが気に入らないようですが、結局エラーの回避方法はわかりませんでした。

【追記】
この記事のテストスクリプトはすべて、Ext.onReady()のなかに書いていたのですが、データの更新部分を関数にし、グリッドの表示後に処理を実行するとエラーが出なくなりました。
データ構築のタイミングの問題なのでしょうか・・・?

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ