2012-04-27 3 views
3

В поле модели ExtJS есть опция отображения.магазин extjs fail

fields: [ 
     {name: 'brandId', mapping:'brand.id', type: 'int'}, 
     {name: 'brandName', mapping:'brand.name', type: 'string'}, 

Проблема заключается в том: если ответ сервера не содержит поле (поле бренда в моем примере) и отображение из внутреннего полей определяется, Ext магазин молча не удается загрузить какую-либо запись.

Есть ли у кого-нибудь проблемы с этим? Это какая-то ошибка?

ОБНОВЛЕНИЕ Чтобы было ясно: предположим, у меня есть десять полей в моей модели. Ответ от сервера имеет девять полей, один отсутствует. Если в этом поле нет вложенного сопоставления (сопоставление: «x.y.z»), все в порядке - запись загружает запись, поле пуст. Но если это поле должно быть загружено из некоторого вложенного поля и имеет параметр сопоставления - хранилище не загружает НИЧЕГО.

ОБНОВЛЕНИЕ 2 Я нашел код, который вызывает проблемы. Дело в том: когда Ext пытается загрузить некоторое поле из Json он выполняет проверку, как этот

(source["id"] === undefined) ? __field0.defaultValue : source["id"] 

Но когда поле имеет опцию отображения (отображение «brand.id») Читатель делает это таким образом

(source.brand.id === undefined) ? __field20.defaultValue : source.brand.id 

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

В случае, если у вас есть такие же проблемы, как я: вы можете исправить это перегрузка Ext.data.reader.Json «s метод createFieldAccessExpression

+0

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

+0

Ну, запись исходит от сервера, у нее просто нет «бренда». Если запись пропускает какое-то поле и нет сопоставления, все в порядке, запись загружается, поле пуста – mik

+0

«(поле бренда в моем примере)« У вас нет поля бренда, показанного здесь. У вас есть brandId и brandName. Просьба уточнить. – Jere

ответ

2

Я согласен, что Ext может быть связано только чтобы загрузить поле, не вся запись. Один из вариантов, который не велик, но он должен работать, вместо этого использовать mapping функцию:

{ 
    name: 'brandId', 
    mapping: function(data, record) { 
     return data.brand && data.brand.id; 
    } 
} 

Я мог бы иметь аргументы неправильно (я понял, что эта функция существует, глядя на исходный код), так что, может быть, поставьте точку останова, чтобы увидеть, что доступно, если оно не работает так.

+0

FYI это было дизайнерское решение, чтение данных может быть довольно медленным, поэтому необходимость иметь блок catch try в случае, когда используется какое-то «сложное» выражение json, не будет идеальным. –

+0

Возможно, Ext мог бы сделать что-то, что я сделал в этом ответе, который использует «&&» - разделенные точки пути, так что, если он не существует, вы получите 'false' –

+0

Хорошая идея, BigSean. Но я пошел с блоком «try ... catch ...». – mik

0

Я думаю, что вы неверно истолковываете mapping и nesting парадигмы: они не взаимозаменяемы. Если вы определяете вложенность в свои данные, результат ДОЛЖЕН иметь соответствующее поле.

+0

Да, оказывается, это работает так, но документация ничего не говорит об этом, и я думаю, что это неправильное поведение. – mik