ExtJS Поиск хранилища данных для значения

Как выполнить поиск в хранилище данных определенной записи? Я пробовал find() и findBy(), но оба возвращают -1.

var index = clientStore.find('ClientID', '37');

У меня есть поле со списком со списком клиентов. Я хочу иметь возможность установить значение по умолчанию для этой комбинации. У меня правильно настроено значение с помощью setValue, и я даже могу установить отображаемое значение с помощью setRawValue, но я не могу запросить хранилище данных на основе clientID и получить название компании для использования в setRawValue.

Имеет ли это смысл?

Вот код хранилища данных в ответ на приведенные ниже вопросы (извините, я не позволил мне вставить его туда)

var frmClientStore = new Ext.data.Store({
    id: 'frmClientStore',
    proxy: new Ext.data.HttpProxy({
        url: 'url here', 
        method: 'POST'
    }),
    reader: new Ext.data.JsonReader({
        root: 'rows',
        id: 'recordID'
    },[
        {name: 'recordID', type: 'int', mapping: 'recordID'},
        {name: 'ClientID', type: 'int', mapping: 'clientID'},
        {name: 'CompanyName', type: 'string', mapping: 'companyName'}
      ])
});

person cmhampton    schedule 30.03.2011    source источник
comment
Можете ли вы опубликовать код, который определяет ваш магазин?   -  person Jonas    schedule 31.03.2011
comment
Если вы поставите точку останова на эту строку и проверите свойство data строки clientStore, включает ли она запись со свойством ClientID, равным '37'? Я подозреваю, что это не так, и это проблема, которую вам нужно решить.   -  person wombleton    schedule 31.03.2011
comment
Код хранилища данных отсутствует в вашем комментарии. Какие поля перечислены в вашем хранилище данных?   -  person NT3RP    schedule 31.03.2011


Ответы (2)


Есть несколько проблем с вашей конфигурацией. Прежде всего, свойство id чтения должно быть свойством idProperty. id-свойство магазина должно быть storeId-свойством (id устарело). И затем ваша переменная называется frmClientStore, а вы ссылаетесь на clientStore в своем коде (может быть опечатка).

var frmClientStore = new Ext.data.Store({
    storeId: 'frmClientStore',
    proxy: new Ext.data.HttpProxy({
        url: 'url here', 
        method: 'POST'
    }),
    reader: new Ext.data.JsonReader({
        root: 'rows',
        idProperty: 'recordID'
    },[
        {name: 'recordID', type: 'int', mapping: 'recordID'},
        {name: 'ClientID', type: 'int', mapping: 'clientID'},
        {name: 'CompanyName', type: 'string', mapping: 'companyName'}
      ])
});

И наконец: вы уверены, что ваш магазин загрузился, когда вы пытаетесь извлечь из него записи?

Пытаться

frmClientStore.load({
    callback: function(rs) {
        console.log(rs);
        console.log(this.find('ClientID', '37'));
    }
});
person Stefan Gehrig    schedule 31.03.2011
comment
Получил работу! Я изменил хранилище данных, как вы предложили, но оно все равно не нашло запись. Тем не менее, он обнаружил, что в функции обратного вызова загрузки все в порядке. Если я помещу туда весь код, он отлично работает. Но если я загружаю магазин, а ПОТОМ пытаюсь искать, он ничего не находит. Для меня это не имеет особого смысла, но я использую ExtJS всего около 2 недель, так что кто знает. В любом случае, большое спасибо, и спасибо всем, кто прокомментировал. - person cmhampton; 31.03.2011
comment
Вы всегда должны помнить об асинхронности всех удаленных операций — это большая проблема при запуске с ExtJS или JavaScript в целом. Загрузка хранилища всегда происходит вне обычного потока программы, поэтому вам нужно понятие обратных вызовов. - person Stefan Gehrig; 31.03.2011
comment
Вы очень помогли, я ценю это. - person cmhampton; 31.03.2011

То, что вы указали, должно быть правильным. Однако я должен отметить, что имя поля чувствительно к регистру. Также возможно, что он ищет строку (как вы указали) вместо числа (что может быть тем, что вы хотите).

Предположим, что "ClientID" является правильным именем поля, вы должны попробовать следующее:

var index = clientStore.find('ClientID', 37);

ИЗМЕНИТЬ

Кроме того, я только что заметил, что что-то не так с вашим JsonReader. Разве это не должно быть больше похоже на это:

//...
reader: new Ext.data.JsonReader({
    root: 'rows',
    id: 'recordID'
    fields: [ //list fields here as part of the JsonReader
        {name: 'recordID', type: 'int', mapping: 'recordID'},
        {name: 'ClientID', type: 'int', mapping: 'clientID'},
        {name: 'CompanyName', type: 'string', mapping: 'companyName'}
    ]
})
person NT3RP    schedule 31.03.2011
comment
Я пробовал оба способа, к сожалению, с тем же результатом. - person cmhampton; 31.03.2011
comment
Какие результаты вы получите, если сделаете frmClientStore.getRange()? - person NT3RP; 31.03.2011
comment
Сначала я подумал, что определение читателя тоже неверно, но на самом деле Ext.data.DataReader также может принимать два аргумента: конфигурацию без fields-свойства и массив определений полей. - person Stefan Gehrig; 31.03.2011