FileReference.save Flex () можно только назвать в обработчике событий пользователя — как я могу обойти это?

Я должен назвать FileReference.save () после того, как вызов веб-сервиса завершился, но этот метод имеет ограничение: "В Flash player можно только назвать этот метод успешно в ответ на пользовательское событие (например, в обработчике событий для события щелчка мышью или нажатия клавиши). Иначе вызов этого метода приводит к Flash player, бросающему Исключение ошибки". (из документации здесь)

Это ограничение немного неопределенно. Это означает, что я могу только назвать FileReference.save () методом из функции обработчика событий, которая регистрируется как слушатель для определенных типов пользовательских событий? Раз так затем точно, какие пользовательские события допустимы? (Возможно, существует событие, которое никогда не будет диспетчеризироваться взаимодействием с пользователем с моим приложением, и я мог зарегистрировать функцию обработчика событий для того типа события и сделать сохранение () вызовом из той функции?)

Моя трудность состоит в том, что я не могу безопасно назвать FileReference.save () методом до моих возвратов веб-сервиса с данными, которые будут использоваться в качестве аргумента FileReference.save () вызов метода, таким образом, событием, которое инициировало FileReference.save () вызов, будет на самом деле ResultEvent, а не пользовательское событие, и я - подозрительная диспетчеризация нового (поддельного) типа пользовательского события, чтобы смочь инициировать FileReference.save () вызов, если это не определенно пользовательское событие, которое никогда не диспетчеризировалось бы в результате фактического взаимодействия с пользователем с моим приложением.

Вкратце то, что я делаю теперь, является этим: у Меня есть функция, которая зарегистрирована как обработчик для нажатия кнопки. В этой функции я выполняю свой вызов веб-сервиса для выборки данных из сервера. У меня также есть функция-обработчик результата, которая вызывается, когда вызов веб-сервиса завершается, и именно в здесь я хочу назвать FileReference.save () методом, так как это в этой точке, что я знаю, что данные готовы быть сохраненными в файл. Но вышеупомянутое ограничение блокирует меня от выполнения этого - я получаю ошибку:

Error #2176: Certain actions, such as those that display a pop-up window, 
may only be invoked upon user interaction, for example by a mouse click 
or button press.

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

Я плохо знаком с разработкой Flex поэтому, возможно, я просто не думаю об этом правильным способом. Если бы кто-либо может предложить другой подход, я был бы очень признателен за его. Заранее спасибо за Ваши комментарии или предложения.

- James

12
задан James Adams 21 July 2010 в 17:00
поделиться

1 ответ

Adobe делает это как своего рода меру безопасности, чтобы гарантировать, что именно пользователи возятся с файлами, а не с потенциально опасным кодом.Насколько я понимаю, они обеспечивают это, разрешая обработчикам событий (щелчков?), Которые происходят из компонентов пользовательского интерфейса, выполнять методы FileReference, поэтому создание ваших собственных событий программно не будет работать, хотя я не пытался это проверить. К сожалению, лучшее решение, которое я нашел, - это немного переработать пользовательский интерфейс, чтобы он соответствовал этому ограничению. В вашей конкретной ситуации вы можете сделать этот процесс двумя щелчками мыши с помощью кнопки, которая говорит что-то вроде «Подготовить загрузку», которая меняется на «Загрузить файл» после завершения работы веб-службы. Это далеко не идеально с точки зрения пользователя, но я не думаю, что что-то еще можно сделать, если только вы не сможете каким-либо образом завершить вызов веб-службы до отображения кнопки, запускающей вызов FileReference.save ().

18
ответ дан 2 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: