Связанные комбобоксы
У меня в компоненте несколько городов и районы в них. В таблице районов есть поле city с id города, а в extjs в BaseParam указан id в параметре city по которому процессор фильтрует только те районы, кот. есть в данном городе. И вот я в городах слушаю событие выбора города и меняю параметр city. Проблема в обновлении комбобокса района автоматически, от выбора города. Т.е. если я выбрал город и в ручную удалил выбранный район — все как надо, выпадает нужный список районов. Но ведь это поле человек может и не трогать, оно должно автоматом обновляться. Так вот, я для этого использую getStore().load(), потом дергаю getStore().data.items и сравниваю что там есть со значением в районе (zone.value). Если getStore().data.items — пусто или там нету объекта с id из zone.value (т.е. по запросу с указанным городом пришли районы, но в них нет того, что сейчас выбран в комбобоксе), то очищаю значение в комбобоксе района. А там уж пользователь нужный ставит. Так вот, я выбираю в комбобоксе город А и затем город Б, срабатывает событие, но в zone.getStore().data.items всегда приходит результат, будто в city id того города, который я выбирал до этого (т.е. город А).
listeners: {
beforeselect: function( combo, record, index ){
var zone = Ext.getCmp(config.id + '-zone'); // получаю районы
zone.getStore().setBaseParam('city', record.id);
console.log(record.id)
//zone.getStore().reload(); // и запрос отправляется таким, будто небыло setBaseParam('city', record.id), а city в BaseParam районов всегда одно и то же!
/* //c.getStore().removeAll(); // пробую разное, чтобы получать свежий результат
zone.lastQuery = null;
zone.clearValue();
zone.totalLength = 0;*/
//zone.getStore().reload(); // reload работает один раз и потом возвращает тот же результат
zone.getStore().load(); // вместо reload используем load
console.log(zone.getStore().data.items) // и тут всегда результаты прошлого запроса, city в BaseParam, которые были в прошлом beforeselect
var i = zone.getStore().data.items // т.е. я выбираю город А, выбираю город Б, а в консоле видно, что запрос уходит с id города А в city
// дальше предполагалось как-то так.
console.log(i)
if(
i.length == 0 ||
!i.some(function(item){return item.id === zone.value;}) // просматриваем, что пришло в хранилеще после релоида запроса с измененным city и проверяем, есть там объект с id, которое сейчас в инпуте
){
zone.clearValue();
}
},
scope:this
}
В общем как-то очищать надо от прошлых запросов или еще что-то делать, чтобы в zone.getStore().data.items были актуальные данные? Комментарии: 4
не делай reload() — делай load()
Так я так и делаю, релоэд закомментирован.
Делаю
Делаю
zone.getStore().load();
var i = zone.getStore().data.items
и в i всегда значение от прошлого запроса.
так у тебя beforeselect — может оттого?
Но это же в комбобоксе города. Там record.id правильный приходил, того города, который выбрал. Я от него и плясал в событии.
Так что по моёной логике не должно зависить.
Так что по моей логике не должно влиять. И главное в консоли та же фигня, там вообще не на событие все срабатывает, а на кнопку выполнить и цифру я вручную вводил…
Тем не менее, поменял на change, record.id заменил на newValue, остальное один в один — заработало. Спасибо.
Но все-таки хотелось бы, чтобы менялось сразу как человек выбрал, а не когда поменял фокус с инпута комбобокса города. И если бы выбранный район после смены города не пропадал — вапче было бы афигенно. Новерн можно его куда-то прятать, хоть в конфиг родительский, и если сново выбран город с этим районом -то возвращать.
Так что по моёной логике не должно зависить.
var zone = Ext.getCmp(config.id + '-zone'); // получаю районы
zone.getStore().setBaseParam('city', record.id);
и дальше понеслось… Т.е. как бы мне главное выбранный id получить, а он приходит и в консоль.лог виден правильный.Так что по моей логике не должно влиять. И главное в консоли та же фигня, там вообще не на событие все срабатывает, а на кнопку выполнить и цифру я вручную вводил…
Тем не менее, поменял на change, record.id заменил на newValue, остальное один в один — заработало. Спасибо.
Но все-таки хотелось бы, чтобы менялось сразу как человек выбрал, а не когда поменял фокус с инпута комбобокса города. И если бы выбранный район после смены города не пропадал — вапче было бы афигенно. Новерн можно его куда-то прятать, хоть в конфиг родительский, и если сново выбран город с этим районом -то возвращать.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.