代码之家  ›  专栏  ›  技术社区  ›  rgargente Chelsea Urquhart

Flex3:同步加载xml文件

  •  3
  • rgargente Chelsea Urquhart  · 技术社区  · 17 年前

    我的问题很简单:在flex3中,有没有同步加载xml文件的方法?

    我知道如何使用加载事件异步加载。这可能有用,也可能不有用。我只想读取文件,解析它,做我必须做的事情,然后继续执行代码。

    我有一个组件,它使用xml文件存储一些配置参数。我需要在初始化对象时读取文件。但是,对于事件模型,我无法控制文件何时加载,因此我必须编写代码“等待”代码加载。这太可笑了,还是我?我想要这样的代码:

    var foo:Foo = new Foo(); //This constructor should read the xml and initialize the object.
    foo.doSomething(); //When I call this method the xml must be already handled.
    

    我可以处理事件上的xml文件,它工作正常,但事件会触发 之后

    我希望我已经解释清楚了。我想这应该很容易,但这让我抓狂。我不想编写代码来等待事件,除非真的有必要。我觉得这一切应该只是一行代码!

    5 回复  |  直到 17 年前
        1
  •  1
  •   grapefrukt    17 年前

    不可能同步加载,flash是为web构建的,您永远无法确定一个呼叫需要多长时间。Air是不同的,因为它是从文件系统加载的,并且那里的延迟量远远没有相同。

    最干净的解决方案是在Foo内部侦听完成的加载,并从内部调用doSomething(),这样您的“外部”类就不需要麻烦了。

    dispatchEvent(new Event(Event.COMPLETE, true));
    

    要抓住这一点,你需要像这样倾听:

    foo.addEventListener(Event.COMPLETE, handleFooComplete);
    

    private function handleFooComplete(e:Event):void{
        foo.doSomething();
    }
    

    无论您选择如何执行,都需要在加载程序上侦听Event.COMPLETE。这是绕不开的。

        2
  •  1
  •   rgargente Chelsea Urquhart    17 年前

    我会自己回答,不过我还是想知道是否有人提出了更好的想法。Dirkgenty和Peter Miehle的回答都很有帮助,但并不能解决我的实际问题。

    我要做的是在创建对象之前加载xml文件,并将其作为参数传递给构造函数。这样,我将确保在需要时加载对象的xml文件。然而,这也不是一个理想的解决方案,因为现在我必须让另一个类负责Foo的“私有事物”。

    还有更好的主意吗?

        3
  •  1
  •   Peter Miehle    17 年前

    我认为,有一个“后”事件与负载。

    伪语法:

    beforeInitialisation()
      disableDoSomething()
      new()...
      loader.addEvent(AFTERLOAD, afterLoad)
    
    
    afterLoad()
      enableDoSomething()
    
    
    someMethod()
      doSomething()
    
        4
  •  1
  •   Ryan    16 年前

    老问题,但我打赌很多人仍然来这里,所以,这是我的解决方案。

    让你想要做某事的对象,我想在本例中是foo,监听这个自定义事件,然后调用doSomething()。

        5
  •  0
  •   dirkgently    17 年前

    呼叫 foo.doSomething(); EVENT.Complete 或者类似的,具体取决于加载文件的方式)。这是推荐的方法。

    推荐文章