Связанные комбобоксы

У меня в компоненте несколько городов и районы в них. В таблице районов есть поле 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 были актуальные данные?
Антон Соловьёв
20 апреля 2015, 13:24
modx.pro
1 092
0

Комментарии: 4

Володя
20 апреля 2015, 16:32
0
не делай reload() — делай load()
    Антон Соловьёв
    20 апреля 2015, 16:43
    0
    Так я так и делаю, релоэд закомментирован.
    Делаю
    zone.getStore().load();	
    var i = zone.getStore().data.items
    и в i всегда значение от прошлого запроса.
      Володя
      20 апреля 2015, 16:47
      0
      так у тебя beforeselect — может оттого?
        Антон Соловьёв
        20 апреля 2015, 17:19
        0
        Но это же в комбобоксе города. Там record.id правильный приходил, того города, который выбрал. Я от него и плясал в событии.

        Так что по моёной логике не должно зависить.
        var zone = Ext.getCmp(config.id + '-zone'); // получаю районы
        zone.getStore().setBaseParam('city', record.id);
        и дальше понеслось… Т.е. как бы мне главное выбранный id получить, а он приходит и в консоль.лог виден правильный.
        Так что по моей логике не должно влиять. И главное в консоли та же фигня, там вообще не на событие все срабатывает, а на кнопку выполнить и цифру я вручную вводил…

        Тем не менее, поменял на change, record.id заменил на newValue, остальное один в один — заработало. Спасибо.
        Но все-таки хотелось бы, чтобы менялось сразу как человек выбрал, а не когда поменял фокус с инпута комбобокса города. И если бы выбранный район после смены города не пропадал — вапче было бы афигенно. Новерн можно его куда-то прятать, хоть в конфиг родительский, и если сново выбран город с этим районом -то возвращать.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4