ExtJs не запускал выбранное событие на ComboBox
У меня проблема с ExtJs ComboBox, считаю, что у меня есть ComboBox с 4 элементами и функция обратного вызова в событии select
на ComboBox.
Когда я собираюсь установить выбранное значение ComboBox с помощью setValue()
, ExtJs не запускает событие select
...
Как я могу исправить эту проблему? Я должен запустить это событие после setValue()
самостоятельно?
Ответы
Ответ 1
Я могу рассказать вам, что сказала поддержка sencha за это год назад:
Ну, событие, по определению, вызывает вызов функции, вызванный пользователем действие, и при вызове select нет действий пользователя.
В любом случае "исправление" легко: вы знаете, что вы вызываете select так сразу после вызывающий select, вы можете вызвать функцию select listener.
Это зависит от вашего дела, что вы должны делать. Для меня я повесил свою реализацию, чтобы я смог вызвать ответный метод, но, с другой стороны, я не вижу недостатков, когда вы запускаете это событие самостоятельно. Поэтому я думаю, что это зависит от вас, который подходит вам больше.
Вот пример того, как вы можете запускать событие самостоятельно (частично из комментария @JohanHaest)
Чтобы сделать это простым, я говорю, что у вас включен только один выбор.
var record = combo.store.getById(id);
combo.select(id);
combo.fireEvent('select', combo, record);
или
combo.select(model);
combo.fireEvent('select', combo, model);
В текущей версии (4.1.3) имеется возможный Hack при установке второго аргумента метода select
на true
. Это, в соответствии с исходным кодом, вызовет событие select. Но первый аргумент должен быть экземпляром модели.
// source-snipped
select: function(r, /* private */ assert)
Таким образом, вызов
combo.select(model, true);
будет запускать событие select, но это может измениться в любое время (версия), потому что assert помечен как закрытый
Ответ 2
Я столкнулся с этим, потому что я неправильно использовал valueField
в combobox... Я не уверен, что это должно делать, но если вы его неправильно установили, он разбивает combobox - он предотвращает событие change
от обстрела вообще и останавливает событие select
от стрельбы более одного раза.
Мое предположение заключается в том, что вы можете иметь несколько объектов в списке, которые представляют один и тот же элемент, а значениеField представляет собой ключ, поэтому, если вы неправильно его установили, ключ undefined для всех и, следовательно, один и тот же для всего. Это означает, что после первого набора значение не считается новым значением.
Похоже, что это довольно нишевое поведение (а не то, что я хотел), поэтому я просто убрал его в своем случае, и все стало работать.
Также я думаю, что событие, которое вы хотите, это событие change
- документация (для 4.1) говорит
Fires when the value of a field is changed via the setValue method.
тогда как select
срабатывает только тогда, когда кто-то нажимает на поле со списком
Совсем немного в стороне, но я также задал вопрос использовать событие для этого - вы знаете, что вы вызвали setValue, так почему бы вам просто не сделать то, что вы хотите, после того, как вы вызовете заданное значение. События имеют тенденцию делать код более запутанным, и если вам не нужна многоадресная рассылка, то обычно лучше не беспокоиться о них.