【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()のなかに書いていたのですが、データの更新部分を関数にし、グリッドの表示後に処理を実行するとエラーが出なくなりました。
データ構築のタイミングの問題なのでしょうか・・・?