2

我正在用 flash AS3 和 puremvc 制作一个应用程序,正确处理视图中介的方法有点让我有点……

好的 - 我有 3 或 4 个不同的观点,每个观点都由它自己的调解人管理。每个视图仅单独显示 - 即。当 1 可见/在舞台上时 - 其他不可见/从舞台上移除(过于简化,但我想可以将其视为单独的页面,一次查看一个,导航栏允许用户在他们喜欢时更改视图)

起初,我创建并添加到舞台上的每个视图调解器都是它自己的视图组件,因此,当“轮到”显示或隐藏该视图时,它很简单 - 为其视图组件添加儿童和删除儿童。

但是,我在 puremvc.org 上读到,这不是一个好习惯。通过舞台(在我的情况下,这是每个中介的 viewComponent - 每个视图都被添加到其中 - 例如 viewComponent.addChild(foo) b. 创建自己的视图 - 这允许我首先添加和删除它.

所以我改成了推荐的方式——当我创建每个中介时,我传入的是它所管理的视图组件(而不是舞台/主文档类)

例如。

var view:MyView = new MyView();
facade.registerMediator( new MyViewMediator( view ) );
viewComponent.addChild(view);

所以 - 在这种情况下 - 我不知道如何在需要时删除/添加每个视图。我可以很容易地从每个调解器中设置可见性,但我有点想避免这样做 - 宁愿在不用于资源管理时删除......

任何人都对我“打算”如何解决这个问题有任何好的想法(例如,当舞台上不再需要视图时,暂时删除它,然后在需要时添加它?) - 或者我是遗漏了一些观点(很可能!)并以错误的方式解决这个问题?我对 puremvc 很陌生,所以不太自信我正在接近它。欢迎指点!

4

3 回答 3

1

我不会假装是 PureMVC 方面的专家,但我喜欢的工作方式是只为站点的主要区域创建一个 Mediator。例如,HeaderMediator、FooterMediator 和 ViewMediator。然后,我有一个 ApplicationMediator,“onRegister”将创建刚才提到的其他中介。这样,我不会为每个单独的视图创建调解器,并且“ViewMediator”处理视图之间的切换。这是我的“onRegister”函数的样子:

override public function onRegister():void {
    var viewContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new ViewMediator(viewContainer));

    var headerContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new HeaderMediator(headerContainer));

    var footerContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new FooterMediator(footerContainer));
}

接下来,我将有一个 ViewProxy,它有一个视图池,等待调用(在数组、字典或向量中)。当需要更改或设置视图时,我使用 ChangeViewCommand 从 ViewProxy 中检索视图并以视图对象作为主体发送通知(如 SET_VIEW)。

现在,ViewMediator 将处理通知“SET_VIEW”。如果它像 removeChild(oldView) 和 addChild(newView) 这样简单,那么我将在 Mediator 本身中处理它。如果转换是必要的并且涉及更多代码,那么我将使用命令来处理转换。

希望这有意义并有所帮助。当然,我喜欢改变事物并尝试新事物,所以如果您有任何疑虑或建议,我愿意听取他们的意见。

于 2011-08-17T02:03:57.553 回答
0

正如 FlexFiend 所提到的,这种情况在第二代框架中更容易处理(至少在 Robotlegs 中,我不能代表其他人)。这是因为,通常情况下,您永远不会在 Robotlegs 中显式创建或销毁中介。相反,您将中介者与视图组件相关联,Robotlegs 会不断地观察舞台上的视图组件是否被添加和删除,并创建和销毁适当中介者的实例。

因此,在 PureMVC 中实现这种事情的一种方法是使用 StageMediator,将舞台本身作为其视图组件,并监听 Event.ADDED_TO_STAGE 和 Event.REMOVED_FROM_STAGE 事件。最后,您将需要一个系统来将视图组件与中介相关联。查看https://github.com/robotlegs/robotlegs-framework/blob/master/src/org/robotlegs/base/MediatorMap.as了解它在 Robotlegs 中是如何完成的。

我实际上即将实现这样的东西,因为我正在开发一个项目,它是 PureMVC 应用程序套件的一部分,但老实说,除非你别无选择,否则我会说最简单的事情就是使用 Robotlegs!

于 2011-08-30T10:45:59.097 回答
0

请问您使用 PureMVC 的动机是什么?我不想在这里发动一场圣战,但创建第二代框架(Mate、Swiz、Robotlegs、Parsely)背后的原因之一是因为 RIA 应用程序架构的入门难度非常大。

不过不要感觉不好,较新的框架有文档,因此很容易理解和找出所有组件、范式和参与者的动机

于 2011-08-16T21:02:39.460 回答