Flex - Parsley - Событие не отправляется из метода в обработчике результатов

У меня есть команда, которая выполняет вызов службы. В обработчике результатов я выполняю некоторую логику на основе данных результата. Если логика соответствует определенным критериям, я показываю всплывающее окно с подтверждением. Если пользователь нажимает кнопку продолжения во всплывающем окне подтверждения, у меня вызывается метод, который отправляет событие Parsley. Это событие с петрушкой не улавливается. Однако, если я отправляю событие Parsley изнутри метода результата, оно перехватывается. Есть идеи, почему событие не перехватывается при его отправке извне метода результата?

Например...

[MessageDispatcher]
[Bindable]
public var dispatcher:Function;

Я выполняю служебный вызов изнутри команды:

public function execute(event:SomeEvent):AsyncToken
{
return service.callService(event.type, false);
}

Теперь у меня есть такой обработчик результатов:

public function result(data:Object):void
{
if (add some logic here based off data)
AlertHelper.showContinueQuestion(onSelection, "Are you sure you want to continue?");
}

Если пользователь нажимает кнопку «Продолжить» во всплывающем окне подтверждения, он вызывает метод onSelection:

private function onSelection():void
{
dispatcher(new SomeEvent(SomeEvent.UPLOAD));
}

Это событие Parsley, SomeEvent, не отслеживается. Однако, если я отправляю это событие после оператора if, оно перехватывается и работает нормально. Есть идеи, почему он не улавливается при отправке извне обработчика результата? Я пробовал и другие команды, и они делают то же самое.


person anad2312    schedule 18.04.2013    source источник
comment
Можем ли мы увидеть ваш обработчик, который должен перехватывать SomeEvent, и где он прикреплен?   -  person Andrew Arace    schedule 18.04.2013
comment
Вероятно, это как-то связано с удалением динамической команды из контекста петрушки, как только обработчик результата завершил выполнение. Хотя это странно, я бы предположил, что ваш внедренный [MessageDispatcher] все еще сможет отправить событие ... можете ли вы подтвердить, что метод onSelection() вызывается и что dispatcher не равно нулю? Обычно я использую отдельную команду для запуска предупреждения ... то есть в обработчике результатов вы отправляете событие show alert. Тогда команда show alert могла бы вернуть AsyncToken и иметь свой собственный обработчик результатов.   -  person Sunil D.    schedule 18.04.2013
comment
Эндрю, я использую файл конфигурации, содержащий DynamicCommand: ‹spicefactory: DynamicCommand type = {SomeCommand} selector = {SomeEvent.UPLOAD} stateful = true /›   -  person anad2312    schedule 18.04.2013
comment
Сунил, я думаю, что это так. OnSelection действительно вызывается. Я думаю, это связано с тем, что вы сказали, из-за того, как работает класс AlertHelper. Похоже, что onSelection в строке кода AlertHelper (см. Выше) вызывает onSelection до завершения остальной части кода. Странный! В любом случае, я закончил тем, что обновил флаг в модели вместо отправки события, и в моем личном кабинете у меня есть BindSetter, который отслеживает изменения этого флага (логическое значение). Не уверен, что мне нравится использовать BindSetter. Есть другие идеи? Спасибо за информацию.   -  person anad2312    schedule 18.04.2013
comment
Сунил, я только что проверил, а в методе onSelection диспетчер имеет значение null. Не знаю, как это удаляется из контекста петрушки. Странный!   -  person anad2312    schedule 18.04.2013


Ответы (1)


Нашел на сайте Spicefactory, работает как задумано. В итоге я обновил флаг в модели, а не отправил событие. Затем у меня есть BindSetter, который отслеживает изменения этого флага в модели. Если для флага установлено значение true, отправляется событие Parsley.

Жизненный цикл командного объекта

Помимо группировки метода выполнения и обработчиков результатов, DynamicCommand также вводит особый вид управления жизненным циклом для объектов команд. Создание объекта не происходит до тех пор, пока не будет отправлено соответствующее сообщение. Затем он становится управляемым объектом контейнера только на время выполнения команды. Он будет немедленно удален из контекста после того, как будет вызван обработчик результата или ошибки. Но во время своего существования это полностью управляемый объект, его зависимости могут быть введены или даже участвовать в обмене сообщениями во время выполнение команды. Но это будет довольно редкий случай, наиболее распространенным сценарием использования, вероятно, является объект команды, просто получающий все зависимости, необходимые для выполнения команды.

person anad2312    schedule 18.04.2013