PureMVC(AS3)中的继承类和动态视图

时间:2009-07-14 04:55:28

标签: flex actionscript-3 puremvc

在这种情况下,我想知道PureMVC中继承类视图的最佳实践:

  • 多个类继承BaseClass(比如说InheritedClass1和InheritedClass2)
  • 每个InheritedClass都有一个相应的视图(从基本视图类派生,但每个都是唯一的)
  • 使用给定的数据集(比如说InheritedClass1 / 2 Objects的ArrayCollection),需要动态加载相应的视图。
  • 数据集相对较大,因此TileList会很好(因为它只实例化当前显示的对象)

我可以想到几个解决方案,但我发现它们太“黑客”而不是最佳解决方案:

  • 在视图中:基于BaseClassView的Repeater,它将视图定义为State(设置为“InheritedClass1”状态以添加InheritedClass1对象) 优点:没有不必要的内存增加(状态对象在需要时被实例化) 缺点:视图取决于数据类型,因此添加了耦合

  • 在Mediator中:根据数据类型循环遍历ArrayCollection和addChild()视图 优点:工作。 缺点:Mediator正在向View中添加内容,这会使Mediator和View分离。比中继器慢。

任何意见或其他建议将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:1)

如果你喜欢第一个例子,答案很简单。为什么不在中介上有一个映射(Object())来分配数据类型来查看组件(或多个状态)。 e.g:

private static var map:Object = {"ic_oneType": "ic_oneState",
                                 "ic_twoType": "ic_twoState"}

中介可以将该地图分配给BaseClassView。

我很可能同意你需要某种形式的viewProxy,它根据从中介器(例如,第一个例子)提供给它的数据呈现所有继承的视图。可以确认或否认状态是否是UI中最佳的操作过程,但没有更具体的示例。

答案 1 :(得分:1)

调解员 是视图的一部分。你如何将它们与View分开是超出我的。

我选择了2.

以下是pureMVC论坛的主题:Dynamically adding View components: where should I do it?。 你应该对“pureMVC”的帖子感兴趣。

此外,数据集的大小可能会有问题。如果它真的很大,你应该考虑使用带渲染器的List而不是为每个项添加一个组件(中继器这样做)。这会使事情进一步复杂化,因为您必须包装数据以保持主要组件与模型分离。

答案 2 :(得分:1)

  

缺点:视图取决于数据   类型,所以添加耦合

通常,视图组件除了显示域数据之外没有其他目的,并且可能允许用户与其进行交互。视图组件需要对域数据有一定的了解。

因此,将一组VO提供给视图组件不会增加“坏”耦合。 “错误”耦合是指视图组件知道如何进入模型层并操纵保存数据的代理。或者当模型层中的代理知道如何获取视图组件或其调解器以将数据戳入其中时。

  

Mediator正在向View添加内容,   这打败了   介体和观点的分离。

正如Coded Signal指出的那样,我们并没有尝试将Mediator与View组件分开。 Mediator是PureMVC系统中的一个参与者,它应该知道视图组件,并调解它与系统其余部分之间的通信。在放松View层和Model层之间的耦合方面,Mediator是系统中最关键的角色。

要与视图组件通信,其他actor会发送通知,Mediator通过操纵视图组件的公开API来响应并响应;勺子喂它数据或调用它的方法。这有效地使应用程序的其余部分无需了解有关组件的任何信息。

Mediator还会侦听组件的事件并代表它执行操作,从模型层检索数据,或将注释发送到其他调解器或触发Controller层中的命令。这使组件不必了解与其连接的系统的任何信息。它只是暴露了属性和方法的API,封装了自己的行为,并在系统应该知道的事情发生时发送事件。

因此,Mediators和View组件共同组成了应用程序的View Tier。

- =崖>

答案 3 :(得分:0)

  

缺点:Mediator正在向View添加内容,这会破坏Mediator和View的分离点

不是真的:它们是文档所指的协作对,应该这样对待。