1

好的,所以我打开了一个 TitleWindow……我定义了 6 个状态。我对所有视图都使用了演示模型模式。我发现了一个令人沮丧的细微差别。当我告诉我的窗口进入 XXX 状态时,控件必须初始化,因为 flex 中的状态使用延迟加载。所以......我的 PM 代码说 myTextArea.text 爆炸并说“无法访问......”所以作为一种解决方法,我在我的控件上创建了一些 creationComplete 事件以向 PM 注册控件。因此,当状态发生变化时,textarea 最终会初始化,并在 creationComplete 调用 PM.registerTextArea() 设置对它的引用。然后在那个函数中我运行我的代码...... myTextArea.text.. 等等。

这似乎是一个丑陋的黑客,我讨厌它。有没有办法等到整个状态在创建然后在 PM 上调用代码?我已经尝试过 enterstate ......但这个事件似乎在状态控件准备好之前触发。

我试图添加评论,但我想编辑是我能做到这一点的唯一方法......

致大家:感谢您的反馈。我正在做一些有点偏离直接 PM 的事情。每个视图都有一个 viewController(我这样称呼它们)。它有点像我自己的委托/数据提供者的混合体。但这没有实际意义。在处理状态时,最痛苦的是弹性组件的生命周期。如果您更改状态.. 没有任何事件可以说“我在此状态下的所有组件都准备好了”。唯一说“我们改变了状态”的事件。所以我在状态变化时触发的代码正试图与尚未准备好的组件对话。所以从我所见,似乎没有设计模式或完美的方法来确保所有组件都在一个状态下创建,除非在该状态下的每个组件上使用 creationComplete 来注册它已经准备好......如果你不这样做,你获得比赛条件。无论是框架还是设计模式,

textarea 是一个简单的 PM 修复.. 只需将其绑定到 pm 值。但有些时候我不能。

具体来说,一旦我达到那种状态,我就会尝试将视频附加到显示器上。这是通过 addchild 完成的。无论我在哪里做.. 在调用 addchild 之前,我需要知道 videoDisplay 已完成加载。我什至尝试了 currentStateChange 事件,因为文档说最后触发......但是唉......状态中的组件仍在初始化。因此,creationComplete 似乎是我唯一的选择。也许保持代码干净的唯一明智的方法是在进入状态后使用 as 创建整个事物(视频显示和视频)。我只是希望 flex 框架有事件来帮助我,而不是在运行中构建所有东西。

4

1 回答 1

0

由于您的 PM 引用了一个可视组件 (myTextArea),因此这不是一个完全纯粹的表示模型形式。它似乎更像是一种监督演示者/控制器类型的设置。

话虽如此,我解决问题的方法是直接使用完整的演示者(根本不了解视图)或使用完整的控制器(视图实现了控制器通信的接口)。在 Flex 中使用 Presenter 的优点是您可以创建一个可绑定的值,例如 text 或 selectedItem,并且视图将在它上线时绑定到该变量,这样处理 Flex 组件生命周期的问题就消失了。

于 2011-07-13T13:08:35.960 回答