1

Ext.data.Storeを使用して、クエリで使用されるフィールド(一意の名前、テーブル、フィールド、ユーザーフレンドリーなタイトル)に関するメタデータを含むJSON応答を返すPHPスクリプトを呼び出しています。次に、各Ext.data.Recordオブジェクトをループして、必要なデータを配列(this_column)に配置し、その配列を別の配列()の最後にプッシュしてcolumns、最終的にこれをExt.grid.ColumnModelオブジェクトに渡します。

私が抱えている問題は、テストしているクエリに関係なく(サイズと複雑さが異なる多数のクエリがあります)、columns配列は常に期待どおりに機能しcolumns[15]ます。でcolumns[16]、そのポイントとそれ以前のすべてのインデックスは、の値で埋められますcolumns[15]。この動作は、配列全体が同じ値で構成されている場合に、ループがExt.data.Storeオブジェクトの最後に到達するまで続きます。

ここにいくつかのコードがあります:

columns = [];
this_column = [];

var MetaData = Ext.data.Record.create([
    {name: 'id'},
    {name: 'table'},
    {name: 'field'},
    {name: 'title'}
]);
// Query the server for metadata for the query we're about to run
metaDataStore = new Ext.data.Store({
    autoLoad: true,
    reader: new Ext.data.JsonReader({
        totalProperty: 'results',
        root: 'fields',
        id: 'id'
    }, MetaData),
    proxy: new Ext.data.HttpProxy({
        url: 'index.php/' + type + '/' + slug
    }),
    listeners: {
        'load': function () {
            metaDataStore.each(function(r) {
                this_column['id'] = r.data['id'];
                this_column['header'] = r.data['title'];
                this_column['sortable'] = true;
                this_column['dataIndex'] = r.data['table'] + '.' + r.data['field'];
                // This display valid information, through the entire process
                console.info(this_column['id'] + ' : ' + this_column['header'] + ' : ' + this_column['sortable'] + ' : ' + this_column['dataIndex']);
                columns.push(this_column);
            });

            // This goes nuts at columns[15]
            console.info(columns);

            gridColModel = new Ext.grid.ColumnModel({
                columns: columns
            });
4

3 に答える 3

0

各実行で this_column 配列は正しく応答していましたが、columns 配列はそうではなかったので、push() に問題があるに違いないと思います。

もう少しいじった後、ループの各反復で this_column 配列をリセットするようにコードを変更しました-問題が修正されたようです...

metaDataStore.each(function(r) {
    this_column = [];
    this_column['id'] = r.data['id'];
    this_column['header'] = r.data['title'];
    this_column['sortable'] = true;
    this_column['dataIndex'] = r.data['table'] + '.' + r.data['field'];
    columns.push(this_column);
});
于 2009-04-02T13:20:14.100 に答える
0

最初に変数this_columnをグローバル コンテキスト (例の上部) で使用するため、グローバル変数になります。代わりに、各列定義をオブジェクト リテラルとしてインスタンス化する必要があります (読みやすいように複数行に分割します)。

metaDataStore.each(function(r) {
  columns.push({
    id: r.data['id'],
    header: r.data['title'],
    sortable: true,
    dataIndex: r.data['table'] + '.' + r.data['field']
  });
});

または、本当に変数を使用したい場合は、これを実行して、それがローカル変数であることを確認できます

metaDataStore.each(function(r) {
    var this_column = {};
    ...
于 2010-04-29T20:42:58.450 に答える
0

機能するものを既に見つけているようですが、将来のためにアドバイスを提供するだけです。手動で中間ステップを実行する代わりに、json ストアと列モデルを直接使用すると、はるかに簡単になります。

グリッドまたはデータビューのどちらを使用しているかはわかりませんが、概念はどちらもほとんど同じです。少しデータをカスタマイズする必要があるが、ここで手動で行う代わりに、実際には prepareData コールバック関数で行うことができます。

于 2009-04-03T20:25:29.477 に答える