【问题标题】:Flex Cairngorm 3 Presentation Model InitializationsFlex Cairngorm 3 表示模型初始化
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我知道这是一个老问题,但你就在这里。我们在现有应用程序中改造了 PM 模式,它最终变成了方钉/圆孔。最后,我们使用了 IOC 依赖注入......(并重写了这个东西)。刚刚在这里再次活跃起来,想要回馈一点,看到我从来没有因为一个好的答案给你功劳。
  • @JasonReeves 是的,从长远来看,Flex 中糟糕的架构确实会对您造成伤害。我的第一份合同涉及我使用的代码有 13 个不同的单例,每个单例在应用程序的所有层中被引用 70 次。尽管如此,该项目并没有走得太远。 IOC 有助于促进测试,并迫使您从一开始就考虑分离关注点和责任。
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2013-12-16
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多