【问题标题】:Flex presentation model: should state be held in the view?Flex 演示模型:视图中是否应该保留状态?
【发布时间】:2013-02-16 00:28:17
【问题描述】:

我有两个视图实例,它们是 V1a 和 V1b。由于它们是相同类型的实例,它们都使用相同的表示模型 (PM1) 实例,因为它作为单例注入到每个实例中。每个视图显示不同的状态(V1a 的 S1a 和 V1b 的 S1b)但是在这两个视图之间切换(例如当它们在 TabNavigator 中时)会产生奇怪的结果:

  1. 用户查看V1a,看到S1a中的状态;
  2. 用户查看 V1b 并看到 S1b 的状态;
  3. 用户再次查看 V1a,但这次看到的是 S1b 的状态。

这是因为 S1b 覆盖了 PM1 单例中的状态,因此当重新打开 V1a 时,视图会显示来自 V1b 的状态。我有三个解决方案:

  1. 不要注入单例!但这似乎是最常见的做法;
  2. 当用户切换视图时,它会将其数据重新注入 PM1。在顶层具有状态并需要将其注入底层的分层视图中,这可能会变得复杂。绑定时需要更加小心;
  3. 保持视图中的状态,并在视图想要采取行动时将其传递给 PM。

解决方案 3 似乎是最简单的。然而,我所读到的关于演示模型的所有内容都倾向于表明状态保存在演示模型中。谁能告诉我哪里出错了?据我所知,在视图中保存状态比在表示模型中更容易、更安全。

【问题讨论】:

  • 我自己不使用演示模型,但您不应该在每个视图中使用不同的模型实例吗?
  • 是的,你是对的。我很困惑,因为我使用的框架 (Tide) 没有让创建新实例变得容易,而且网上写的很多内容都是相互矛盾的。

标签: apache-flex singleton state presentation-model


【解决方案1】:

解决方案 1 是一个很好的解决方案 - 将您的 PM 类配置为不是单例的。不幸的是,据我所知,Tide 框架不支持这一点。其他 DI 框架将 - 例如,Parsley(不再维护)支持每次注入新实例的 DynamicObject。 RobotLegs(已维护)有一个 mapClass 注入器映射,它会为每次注入提供一个新实例。

解决方案 2 听起来很混乱。

如果 Tide 框架不提供动态对象,解决方案 3 听起来不错。

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多