1

以下では、フィールド (列) の値に格納されている値に基づいて、グリッド内のカテゴリ フィールドのデータ ストア内の特定のカテゴリ レコードを取得しようとしています。「categoryId」の値は「2」を返します。findRecord がレコードを返さないのはなぜですか? 「カテゴリ」には「-1」が表示されます。フォームのドロップダウンのコンボ ボックス ストアとして使用すると、key=2 のレコードが存在します。最終的には、key=2 のレコードを見つけてから value プロパティを返したいので、そのレコードの value プロパティをグリッド ビューに表示します。

参考までに:「キー」プロパティはカテゴリ レコードの ID であり、「値」プロパティは表示する (またはグリッド セルにレンダリングする) カテゴリ レコードの名前です。

カテゴリストア:

Ext.define('DropdownOption', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'key' },
        { name: 'value' }
    ]
});

var statusDropdownStore = new Ext.data.Store({
    proxy: new Ext.ux.AspWebAjaxProxy({
        url: '/track/Controls/Shared/GeneralService.asmx/GetDropdownOptions',
        actionMethods: {                
            read: 'POST'
        },
        extraParams: {
            user_login: authUser,
            table_name: '[status]'
        },
        reader: {
            type: 'json',
            model: 'DropdownOption',
            root: 'd'
        },
        headers: {
            'Content-Type': 'application/json; charset=utf-8'
        }
    })
});   

ビュー (Ext.grid.Panel) 列:

            columns: [

                ... snip ...

                { text: 'Status', dataIndex: 'status', sortable: true, 
                    renderer: function(value, metaData, record, row, col, store, gridView) { 

                        var categoryId = record.get('status');
                        alert("categoryId: " + categoryId);  // displays "categoryId: 2"
                        if (categoryId > 0)
                        {
                            var category = statusDropdownStore.findRecord('key', categoryId);
                            alert("category: " + category);  // displays "category: -1" which usually means not found
                            //alert(category.get('value'));
                            return '';  // return value property of category record
                        }
                        else
                        {
                            return '';
                        }
                    } 
                },

                { text: 'Date Modified', dataIndex: 'date_modified', sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y') },

                ... snip ...

            ],

====================

2012 年 8 月 1 日 @ 午後 5 時 21 分更新:

さて、グリッドの初期ロードでは値が空白です (つまり、コードの「return '';」行にヒットします。しかし、レコードに移動して「保存」をクリックすると、グリッド内のすべての行にカテゴリ名が表示されます-- 以下の新しいコードを使用 補足として、以前は「key」という名前の id 列を使用していましたが、名前を「id」に変更しました。

                { text: 'Status', dataIndex: 'status', sortable: true, 
                    renderer: function(value) { //, metaData, record, row, col, store, gridView) { 

                        if (value > 0) {
                            var r = statusDropdownStore.findRecord('id', value);
                            if (r != null)
                            {
                                var catName = r.get('value');
                                return catName;
                            }
                        }
                        return '';
                    } 
                },
4

2 に答える 2

5

あなたのコードは完全にうまく見えます、私はレンダラーにも同じことをします:

renderer: function(value) {
    if (value) {
        var record = refStore.findRecord('id', value),
            name = record.get('name');
        return name;
    }
},

奇妙なことに、-1ではなく、見つからない場合findRecordに戻ることになっています。null

私が考えることができる唯一のことは、ドキュメントからこれです:

ストアがフィルター処理されると、フィルター内でのみレコードが検索されます。

これが私がそのために使用するモデルですrefStore(上記):

Ext.define('MyApp.model.Reference', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id',    type: 'int'},
        {name: 'name',  type: 'string'},
        {name: 'active',type: 'bool'}
    ],
});
于 2012-08-01T21:27:24.650 に答える
0

findByRECord のプロトタイプを見る

findRecord: function(fieldName, value, startIndex, anyMatch, caseSensitive,    exactMatch) {        
var index = -1;

  if(fieldName && (value || value === 0)) {
    var options = Ext.applyIf({
        property: fieldName,
        value: value,
        anyMatch: anyMatch,
        caseSensitive: caseSensitive,
        exactMatch: exactMatch,
        root: 'data'
    }, {
        anyMatch: false,
        caseSensitive: false,
        exactMatch: true
    });
    var filter = Ext.create('Ext.util.Filter', options);
    index = this.data.findIndexBy(filter.getFilterFn(), null, startIndex);
  }

  return index > -1 ? this.getAt(index) : null;
}

true を最後の引数として使用すると、問題が解決します。

于 2015-04-17T11:38:10.037 に答える