【问题标题】:PureMVC Mediators and views - creation and controlPureMVC 中介者和视图 - 创建和控制
【发布时间】:2011-08-16 20:15:37
【问题描述】:

我正在使用 flash AS3 和 puremvc 制作应用程序,正确处理视图中介的方法有点让我吃惊......

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

一开始,我创建并添加到每个视图中介器,并将其添加到它自己的视图组件中,因此,当“轮到”显示或隐藏该视图时,它很简单 - addChild 和 removeChild 用于它的视图组件。

但是,我在 puremvc.org 上读到,这不是一个好习惯 一种。通过舞台(在我的例子中,这是每个中介的 viewComponent - 每个视图都被添加到 - 例如 viewComponent.addChild(foo) 湾。创建自己的视图 - 这让我可以首先添加和删除它。

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

例如。

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

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

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

【问题讨论】:

    标签: flash actionscript-3 puremvc mediator


    【解决方案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 本身中处理它。如果转换是必要的并且涉及更多代码,那么我将使用命令来处理转换。

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

    【讨论】:

    • 感谢您的回复。听起来你和我做的大致相同——在 ApplicationMediator 中创建“其他”中介。因此,鉴于您描述的设置-“我将在 Mediator 本身中处理它”位-您是如何做到的?例如。你的 ViewMediator - 当你创建它时,你将视图(viewContainer)传递给中介,所以在 ViewMediator 中,你究竟如何删除 viewContainer?
    • 例如。第一次你想删除它(假设它在显示列表中) - viewComponent.parent.removeChild(viewComponent);会这样做 - 但是如何重新添加它?你不能去 viewComponent.parent.addChild(viewComponent);因为 viewComponent 不再有父级...明白我的意思了吗?还是我错过了什么?
    【解决方案2】:

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

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

    【讨论】:

    • 没关系 - 我不觉得难过 :-) 实际上我非常喜欢 PureMVC - 用于 AS3 工作。对于 Flex,我不太确定 - 但同样,我才刚刚开始研究它。
    • 哦,以及为什么我将它用于 AS3 - 只是想是时候我没有做所有“定制”的事情,而是按照公认的框架/元模式/任何你想要的东西来制作东西称它为。 PureMVC 被广泛使用,因此值得关注(再说一次,我非常喜欢它——是的,它有缺点,但一切都是如此)一旦我掌握了这一点,我可能会看看 Robotlegs 版本。到那时,还是很想知道这个问题的答案!
    【解决方案3】:

    正如 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!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多