Ext JS 4: почему моя функция findRecord Ext.data.Store не возвращает значение?

Ниже я пытаюсь получить запись определенной категории в моем хранилище данных для поля категории в моей сетке на основе того, какое значение хранится для значения этого поля (столбца). Значение «categoryId» возвращает «2». Почему findRecord не возвращает запись? Он отображает «-1» для «категории». Когда я использую его в качестве хранилища со списком для раскрывающегося списка в моей форме, существует запись, в которой ключ = 2. В конечном итоге я хочу найти запись, где ключ = 2, а затем вернуть свойство значения, чтобы оно отображало свойство значения этой записи в моем представлении сетки.

К вашему сведению: свойство «ключ» — это идентификатор записи категории, а свойство «значение» — это имя записи категории, которую я хочу показать (или отобразить в ячейке сетки).

Магазин категорий:

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 ...

            ],

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

01.08.2012 в 17:21 обновление:

Хорошо, значения пусты при начальной загрузке сетки (это означает, что она попадает в строку кода «return '';». Но когда я захожу в запись и нажимаю «Сохранить», все строки в сетке показывают название категории --используя новый код ниже. В качестве примечания: раньше у меня был столбец id с именем «key», но я переименовал его в «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 '';
                    } 
                },

person MacGyver    schedule 01.08.2012    source источник
comment
Привет. Можете ли вы опубликовать то же самое в jsFiddle, используя Store с локальными данными? Делая это, мы можем видеть, что происходит не так.   -  person davidbuzatto    schedule 02.08.2012
comment
что вам дает console.log(value) как первая строка рендерера?   -  person egerardus    schedule 02.08.2012


Ответы (2)


Ваш код выглядит совершенно нормально, я делаю то же самое и для рендереров:

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

Странно то, что findRecord должен возвращать null, если не найден, а не -1.

Единственное, о чем я могу думать, это из документации:

Когда хранилище отфильтровано, находит записи только в пределах фильтра.

Вот модель, которую я использую для этого refStore (выше):

Ext.define('MyApp.model.Reference', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id',    type: 'int'},
        {name: 'name',  type: 'string'},
        {name: 'active',type: 'bool'}
    ],
});
person egerardus    schedule 01.08.2012
comment
Можете ли вы вставить одну из ваших моделей, которая работает? Я попытался добавить idProperty:'key' в свою модель, чтобы сделать каждую запись уникальной, но это не сработало. - person MacGyver; 02.08.2012
comment
хорошо, чтобы исправить мою последнюю проблему, когда она изначально не загружала имена категорий при начальной загрузке, я просто установил для свойства autoLoad значение true в моем хранилище данных Ext.grid.Panel. - person MacGyver; 02.08.2012

См. прототип 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 в качестве последнего аргумента, это решит вашу проблему.

person Manu    schedule 17.04.2015