【发布时间】:2011-07-13 04:56:46
【问题描述】:
好的,所以我打开了一个 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 框架有事件来帮助我,而不是在运行中构建所有东西。
【问题讨论】:
-
你可能不喜欢这个,因为它有点脏,但是在视图类中创建一个公共的可绑定变量来保存应该在文本区域中显示的值呢?这样,您可以通过接口从控制器推送到演示文稿,但视图实际上使用内部“缓冲区”来保存值,直到控件被创建并绑定到它?
-
另外,您使用 MVP 的动机是什么,我已经尝试理解了几次,但从未真正实现过它,因为除了可能更容易测试和稍微有点之外,我没有看到 MVC 的优势更加解耦,但由于额外的复杂性,这似乎不值得。只是出于好奇,动机是什么?
-
@shaunhusain: MVP != 演示模型。我喜欢 MVC 上的 Presentation Model,因为它不那么复杂,高度解耦,并且以可测试的方式提供了出色的视图抽象。
-
我认为您需要向我们展示一些说明问题的代码。
-
@Brian Genisio,该声明值得商榷。我经常将 MVP 与模型-视图-演示者(演示模型或演示者优先)相关联。这是语义。 @Jason,请发布代码。我认为你在 PM/上下文中做了一些事情。
标签: apache-flex actionscript-3 cairngorm presentation-model parsley