我需要在 Web 服务调用完成后调用 FileReference.save(),但此方法有一个限制:“在 Flash Player 中,您只能成功调用此方法以响应用户事件(例如,在事件处理程序中)用于鼠标单击或按键事件)。否则,调用此方法会导致 Flash Player 引发错误异常。” (来自这里的文档)
这个限制有点模糊。这是否意味着我只能从注册为某些类型用户事件的侦听器的事件处理函数中调用 FileReference.save() 方法?如果是这样,那么究竟哪些用户事件是有效的?(也许有一个事件永远不会被用户与我的应用程序交互分派,我可以为该事件类型注册一个事件处理函数并在该函数中进行 save() 调用?)
我的困难是我不能安全地调用 FileReference.save() 方法,直到我的 Web 服务返回将用作 FileReference.save() 方法调用的参数的数据,因此触发 FileReference 的事件。 save() 调用实际上是一个 ResultEvent 而不是用户事件,我对调度一个新的(假的)用户事件类型持怀疑态度,以便能够触发 FileReference.save() 调用,除非它绝对是一个用户事件永远不会因为用户与我的应用程序的实际交互而被分派。
简而言之,我现在正在做的是:我有一个注册为按钮单击处理程序的函数。在这个函数中,我调用 Web 服务从服务器获取数据。我还有一个结果处理函数,它在 Web 服务调用完成时被调用,我想在这里调用 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() 调用创建第二个鼠标单击事件处理函数,并在超时间隔后调用它(给 Web 服务时间来完成),但我保留遇到同样的错误——也许这种方法不起作用,因为第二个函数没有注册为用作其参数的事件类型的事件侦听器。
我是 Flex 开发的新手,所以也许我只是没有以正确的方式思考这个问题。如果有人可以提出另一种方法,我将不胜感激。提前感谢您的意见或建议。
- 詹姆士