当 XML 从外部源加载时,我在程序流控制方面遇到困难。我正在使用 Flash Builder 4.6
应该发生什么:使用加载器。侦听何时加载。当它触发 COMPLETE 事件时,继续。发生了什么:使用加载程序。侦听何时加载。但在触发 COMPLETE 事件之前,程序控制返回到调用类。因此,与此同时,程序继续运行并抛出错误,因为它试图访问空数据。
涉及三个类:
- AdvocacyWiz.mxml - 此AIR移动应用程序的基本MXML文件
- Model.as - 模型类
- myXMLLoader.as - 加载器在其中加载数据的类,然后完成后调度事件。
添加到舞台,我就会在AdvocacyWiz.mxml中调用函数setUpModel()。该类中的 setUpModel 函数如下所示:
Model.Instance.initialize(); //model is a singleton
初始化函数调用调用我的 XMLLoader.as 类中的加载器。这就是事件侦听器侦听 Complete 事件的位置,该事件发生得太晚,无法防止发生 null 错误。
编辑:这是代码 -
在 AdvocacyWiz.mxml 中(首先触发):
protected function addedToStageHandler(event:Event):void
{
setUpModel();
stage.scaleMode = StageScaleMode.NO_SCALE;
//... additional layout functions
private function setUpModel():void {
Model.Instance.initialize();
}
在模型中(第二次触发):
public function initialize():void {
addEventListeners(); //this includes listener for StoriesXMLLoader.STORY_LOADED event which will be dispatched from the loader class.
useExternalXML();
...
}
private function useExternalXML():void
{
myLoader.getStory("1140");
}
在加载器类中:
public function getStory(storyId:String):void {
var url:String = "http://mysite.com/whatever.xml";
myLoader.dataFormat = URLLoaderDataFormat.TEXT;
myLoader.addEventListener(Event.COMPLETE, storyXMLLoaded);
myLoader.load(new URLRequest(url));
}
private function storyXMLLoaded(e:Event):void {
storyXML = new XML(e.target.data);
dispatchEvent(new Event(StoriesXMLLoader.STORY_LOADED));
}
我想做的是调用setUpModel(),但在模型实际具有数据之前不要将流返回到mxml类。
谢谢。
好吧,您没有提供任何代码,这将有很大帮助,但这里有一些提示。
应该发生什么:使用加载器。侦听何时加载。什么时候 它触发 COMPLETE 事件,继续。发生了什么:使用加载程序。 侦听何时加载。但在 COMPLETE 事件触发之前, 程序控制返回到调用类。所以与此同时, 程序继续运行并抛出错误,因为它正在尝试访问 数据为空。
很多 Flex 都是异步的。这意味着当您尝试从外部源加载时,程序控制会立即返回,如您所指出的。
为了获得所需的程序流类型,您需要具有在该调用之后调用load()
结束的函数。然后,当 COMPLETE 事件侦听器触发时,可以执行导致 null 异常的其余代码。