Flash PureMVC中介和视图-创建和控制

Flash PureMVC中介和视图-创建和控制,flash,actionscript-3,puremvc,mediator,Flash,Actionscript 3,Puremvc,Mediator,我正在用flash AS3和puremvc制作一个应用程序,正确处理视图中介的方法让我有点 好的-我有3或4个不同的视图,每个视图都由它自己的中介控制。 每个视图仅显示在自己的页面上-即,当1个视图可见/在舞台上时-其他视图不可见/从舞台上移除(过于简化,但我猜可以被视为单独的页面,一次查看一个,导航栏允许用户在喜欢时更改视图) 起初,我创建并添加到stage的每个视图中介都是自己的视图组件,因此,当“轮到”显示或隐藏该视图时,它的视图组件是简单的-addChild和removeChild 然而

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

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

起初,我创建并添加到stage的每个视图中介都是自己的视图组件,因此,当“轮到”显示或隐藏该视图时,它的视图组件是简单的-addChild和removeChild

然而,我在puremvc.org上读到,这不是一个好的实践 A.传递stage(在我的例子中,它是每个中介的viewComponent,每个视图都被添加到其中-例如viewComponent.addChild(foo)) b、 创建它自己的视图-这允许我首先添加和删除它

因此,我改为推荐的方式——当我创建每个中介时,我传入的是它所管理的视图组件(而不是stage/main doc类)

例如

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


任何人都有好的想法,或者我是如何“注定”去做这件事的(比如,当舞台上不再需要某个视图时,暂时删除它,然后在需要时添加它?),或者我错过了某一点(很可能!)这是错误的做法吗?我对puremvc还很陌生,所以我不太有信心我会正确处理它。指针是最受欢迎的!

我可以问问你使用puremvc的动机吗?我不想在这里开始一场圣战,但这是创建第二代框架(Mate、Swiz、Robotlegs、Parsely)的原因之一这是因为在开始使用RIA应用程序架构时遇到了相当大的困难


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

我不会假装是PureMVC的专家,但我喜欢的工作方式是只为站点的主要领域创建一个中介例如,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)一样简单,那么我将在中介器本身中处理它。如果需要转换并且涉及更多代码,那么我将使用命令来处理转换


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

正如Flexfend提到的,这种情况在第二代框架中更容易处理(至少在机器人腿中,我不能代表其他框架)。这是因为,通常情况下,您不会在Robotlegs中显式创建或销毁中介;相反,您会将中介与视图组件关联,Robotlegs会不断监视添加和删除视图组件的阶段,并创建和销毁相应中介的实例

因此,在PureMVC中实现此类功能的一种方法是使用StageMediator,将stage本身作为其视图组件,并侦听Event.ADDED_to_stage和Event.remove_FROM_stage events。最后,您将需要一个系统来将视图组件与中介关联。请查看在Robotlegs中是如何实现的


事实上,我正准备实现这样的东西,因为我正在从事一个项目,它是一套PureMVC应用程序的一部分,但老实说,除非你别无选择,否则我会说最简单的方法就是简单地使用机器人腿!

没关系-我不觉得很糟糕:-)我实际上非常喜欢PureMVC-用于AS3工作。对于Flex,我不太确定,但我只是刚刚开始研究它。哦,还有为什么我要在AS3中使用它?我只是觉得我是时候不做所有的“定制”了,不做任何可以接受的框架/元模式/任何你想叫它的东西了。PureMVC被广泛使用,因此值得一些关注(同样,我非常喜欢它——是的,它有缺点,但一切都有缺点),一旦我掌握了这一点,我可能会看看Robotlegs版本。直到那时,我还是很想知道这个问题的答案!谢谢你的回复。听起来您的做法与我大致相同——在ApplicationMediator中创建“其他”中介。因此,考虑到您描述的设置——“我将在调解人自身中处理它”这一点,您是如何做到的?例如,您的ViewMediator-在创建视图(viewContainer)时,您正在将视图(viewContainer)传递到中介中,因此在ViewMediator中,您具体如何删除viewContainer?例如,第一次要删除它时(假设它在显示列表上)-viewComponent.parent.removeChild(viewComponent);我会的,但是你怎么把它加回去呢?不能转到viewComponent.parent.addChild(viewComponent);由于viewComponent不再具有父级。。。看到我说的了吗
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));
}