嗯,当然不是字面意思,但是:
我是Flex的新手,我正在试图找出在我的应用启动时将我想要运行的代码放在哪里。在我的示例中,我在标记中定义了树控件,并且我有AS代码,可以从本地文件或Web服务填充它。如何将一个绑定到另一个,以便在创建控件时运行代码?
我在文档中找到的示例都使用事件处理程序,i。即他们在控件的开始标记中放入'creationComplete =“myInitFunction(evt)”'。这意味着我会写一个初始化东西的小胶水功能。
现在,正如我所理解的那样,Markup实际上已在内部转换为AS类。那么我不能只定义一个由引擎实例化的类并将我的启动代码放在构造函数中吗?也许甚至可以扩展Tree类?
修改:
几个月后,我更聪明了。在尝试滥用扩展组件类的构造函数之后,我不得不了解Flex并不期望构造函数做得太多 - 当然不会从网络上加载数据。
“编程Flex 3”中的组件生命周期说明非常有用。现在,我的构造函数都是空的,我正在覆盖生命周期方法,例如createChildren
用于很多事情,并将事件用于任何涉及延迟或依赖于外部因素的事件,尤其是网络内容。
例如,我使用creationComplete
发起异步网络请求(使用HTTPService
),当返回有ResultEvent和FaultEvent处理程序时,ResultEvent更新我数据绑定的数据模型我的控件。这看似非常灵活,效果很好。
答案 0 :(得分:5)
创建完成Application组件后,将调度creationComplete事件(在Application对象上)。一旦整个应用程序完成(布局等),就会调度applicationComplete事件,并且用户可以看到它(加载屏幕已完成)。
对于你提到的情况 - 你在启动时填充控件 - 我建议使用组件的creationComplete事件包含你想要填充的控件(Tree in你的情况),这听起来像是你的应用程序组件。这通常是一种很好的做法,因为此代码通常取决于您正在填充的组件的兄弟组件(例如,HTTPService组件)。
你是对的,所有MXML都在AS3中转换,然后编译。有一个编译器标志将保留生成的AS3(尽管它是只读的)。你不想搞砸。由于UIComponent实例化序列(构造函数,样式,布局等)的(某种程度上)复杂性,绝对是在creationComplete事件(或类似)中填充控件的最佳实践。
答案 1 :(得分:2)
从技术上讲,int main()与actionscript 3中应用程序类的构造函数类似。这对于Flex来说意味着无论应用程序mxml文件的根节点(通常是mx:Application)是什么,构造函数都是该类是你的int main()。
但是就像其他海报提到的那样,你想要做的是听mx:应用广播的一个事件。 Initialize是一个放置初始化逻辑,加载配置文件或做任何你需要做的事情的好地方,它不依赖于任何UI对象或任何尚未创建的东西。否则,即使您希望收听,也是最有可能创建完成的。
您真的不需要使用applicationComplete事件。
答案 2 :(得分:0)
您应该寻找处理启动事件。
我在Flex上并不是真的'up',但根据http://www.wietseveenstra.nl/blog/2007/02/understanding-the-flex-application-startup-event-order:
applicationComplete()调度 应用程序之后的事件 初始化,由...处理 LayoutManager并添加到显示中 名单。这是最后一次活动 在申请期间发送 启动。它晚于 应用程序的创建完成() 事件,之前被派遣过 预载器已被删除和 申请已被附加到 显示列表。