ExtJS 4.1.1a: JsonStore + proxy + url = невозможно вызвать метод indexOf неопределенного

Этот блок кода работает:

Ext.define('MyApp.store.MyJsonStore', {
    extend: 'Ext.data.Store',
    fields: ['fieldName'],
    proxy: {
        type: 'ajax',
        url: 'json.php',
        reader: 'json'
    }
});

Этот вылетает:

Ext.define('MyApp.store.MyJsonStore', {
    extend: 'Ext.data.JsonStore',
    fields: ['fieldName'],
    proxy: {
        type: 'ajax',
        url: 'json.php',
        reader: 'json'
    }
});

Вот место, где возникает проблема:

введите здесь описание изображения

Я делаю что-то неправильно?


person leaf    schedule 17.01.2013    source источник


Ответы (2)


JsonStore - это что-то вроде красной зоны в библиотеке ExtJs...

Если вы посмотрите на источник JsonStore вы увидите:

constructor: function(config) {
    config = Ext.apply({
        proxy: {
            type  : 'ajax',
            reader: 'json',
            writer: 'json'
        }
    }, config);
    this.callParent([config]);
}

Практически магазин переопределяет вашу собственную конфигурацию.

Честно говоря, я с трудом могу понять, почему вы предпочитаете JsonStore Ext.data.Store. Json больше подходит для чтения с точки зрения дизайна — хранилище просто хранит записи.

Я использую только Ext.data.Store и Ext.data.TreeStore в своих приложениях.

person Izhaki    schedule 17.01.2013
comment
Недавно я переключился с 4.1.0 на 4.1.1, чтобы получить возможности компилятора и MVC. В версии предотвращения этот код был правильным. Спасибо за объяснение, теперь я в порядке. - person leaf; 17.01.2013
comment
Магазин JSON отстой! Я потратил целый день на эту ерунду. В более ранних версиях это работало хорошо - person hop; 23.08.2013

У меня была аналогичная проблема в Ext JS 4.2.1 с магазином JsonP, вызванная тем, что не был задан URL-адрес в начальной конфигурации хранилища. Я создавал URL-адрес, динамически передавая его во время загрузки:

myStore.load({ url: 'json.php' });

Это привело к тому, что он успешно загрузил переданный URL-адрес, но я также получил ту же самую ошибку и трассировку стека, что и у вас, и данные никогда не отображались на самом деле (я мог видеть это только через инструменты разработчика Chrome). Я решил проблему, используя следующий код:

myStore.proxy.url = 'json.php';
myStore.load();

Я знаю, что мы делаем не совсем одно и то же, но ошибки, которые мы получили, идентичны, так что, надеюсь, это, по крайней мере, может указать вам правильное направление.

ОБНОВЛЕНИЕ

Как оказалось, проблема на самом деле возникла из-за ComboBox, который автоматически загружал свои значения. Он пытался повторно загрузить значения, когда я щелкал по нему, и хотя я успешно загрузил их в первый раз, передав URL-адрес в вызове load({}), он использовал свой собственный метод загрузки, который использовал прокси-сервер. URL (который был неопределенным). Вот почему установка URL-адреса прокси остановила ошибку.

Настоящим решением для меня было предотвратить автоматическую загрузку ComboBox, установив для конфигурации queryMode значение local.

person Kevin Cooper    schedule 12.06.2013
comment
Извините, но я не помню контекст, много времени прошло с тех пор, как возникла эта проблема. В любом случае, спасибо за ваш вклад, это наверняка поможет кому-то. - person leaf; 13.06.2013