好吧我有一个我打开的TitleWindow ......我定义了6个状态。我正在使用Presentation模型模式来表达我的所有观点。我发现了令人沮丧的细微差别。当我告诉我的窗口进入XXX状态时,控件必须初始化,因为flex中的状态使用延迟加载。所以...我的PM代码说myTextArea.text炸弹并说“无法访问......”所以作为解决方法,我在我的控件上做了一些creationComplete事件来向PM注册控件。所以当状态改变时,textarea最终初始化并在creationComplete上调用PM.registerTextArea(),它设置对它的引用。然后在该函数中我运行我的代码... myTextArea.text ..等等。
这看起来像是一个丑陋的黑客,我讨厌它。有没有办法等到创建完整的状态然后在PM上调用代码?我已经尝试过entertate ...但是这个事件似乎在状态控件准备好之前触发了。
我试图添加评论,但我想编辑是我能做到这一点的唯一方法......
给大家:感谢您的反馈。我正在做一些略微偏离PM的事情。每个视图都有一个viewController(我称之为)。它有点像我自己的委托/数据提供者的混合体。但这没有实际意义。在处理痛苦的状态时,它是flex组件的生命周期。如果你改变状态..没有事件要说“这个状态下我所有的组件都准备好了”。只有事件说“我们改变了状态”。所以我的代码触发状态更改正在尝试与尚未准备好的组件进行通信。所以从我看来,似乎没有设计模式或完美的方法来确保所有组件都是在一个状态下创建的,除非在状态中的每个组件上使用creationComplete来注册它已经准备就绪...如果你没有,你就是得到一个竞争条件。无论框架或设计模式如何,这似乎都是根本问题。
textarea是一个简单的PM修复程序..只需将其绑定到pm值即可。但还有其他时候我不能。
具体来说,一旦我到达那个状态,我正试图将视频附加到显示器上。这是通过addchild完成的。不管我在哪里做..我需要知道videoDisplay在我调用addchild之前已经完成加载。我甚至尝试过currentStateChange事件,因为文档说火灾持续了......但是唉......状态中的组件仍在初始化。所以似乎creationComplete是我唯一的选择。也许保持清理代码的唯一理智方法是在输入状态时创建整个事物(视频显示和视频)。我只是希望flex框架能让我在这里发生一些事情,而不是像现在一样动态修复所有内容。
答案 0 :(得分:0)
由于您的PM具有对可视组件(myTextArea)的引用,因此这不是完全纯粹的表示模型。它似乎更像是监督演示者/控制器类型的设置。
话虽如此,我解决问题的方法是直接使用完整的演示者(根本不知道视图)或使用完整的控制器(视图实现控制器通信的接口)。在Flex中使用presenter的优点是你可以创建一个可绑定的值,例如text或selectedItem,并且只要它在线,视图就会绑定到该变量,因此处理Flex组件生命周期的问题就会消失。