我正在使用flash AS3和puremvc创建一个应用程序,正确处理视图调解器的方式有点让我有点......
好的 - 我有3个或4个不同的视图,每个视图都由它自己的中介控制。 每个视图仅显示在其自身 - 即。当1可见/在舞台上 - 其他是不可见的/从舞台上移除(过度简化,但我想可以被认为是单独的页面,一次查看一个,导航栏允许用户在他们喜欢的时候更改视图)
首先,我创建并添加了每个视图中介来暂存它自己的视图组件,因此,当它“转向”显示或隐藏该视图时,它很简单 - addChild和removeChild为它的视图组件。 / p>
但是,我在puremvc.org上读到,这不是一个好习惯 一个。绕过阶段(在我的情况下是每个调解器的viewComponent - 每个视图都被添加到 - 例如.viewComponent.addChild(foo) 湾创建自己的视图 - 这允许我首先添加和删除它。
所以我改为推荐的方式 - 当我创建每个中介时,我传入的是它所管理的视图组件(而不是stage / main doc类)
例如
var view:MyView = new MyView();
facade.registerMediator( new MyViewMediator( view ) );
viewComponent.addChild(view);
所以 - 在这种情况下 - 我不知道如何在需要时删除/添加每个视图。 我可以很容易地从每个调解器中设置可见性,但我有点想避免这样做 - 更喜欢在不用于资源管理时删除...
任何人都有任何好的想法要么我“意味着”这样做(如在舞台上不再需要视图时,暂时删除它,并在以后需要时添加它?) - 或者我错过了一些观点(非常可能!)并以错误的方式解决这个问题?我对puremvc很新,所以不太自信我正在接近它。指针最受欢迎!
答案 0 :(得分: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本身处理它。如果需要转换并涉及更多代码,那么我将使用命令来处理转换。
希望有意义并有所帮助。当然,我喜欢改变一些事情并尝试新事物,所以如果您有任何疑虑或建议,我愿意听取他们的意见。
答案 1 :(得分:0)
我可以问你使用PureMVC的动机吗?我不想在这里开始一场神圣的战争,但是创建第二代框架(Mate,Swiz,Robotlegs,Parsely)背后的原因之一是因为开始使用RIA应用程序架构时有很多困难。
不要感觉不好,新的框架有文档,因此很容易理解并找出所有组件,范例和演员的动机。
答案 2 :(得分:0)
正如FlexFiend所提到的,这种情况在第二代框架中更容易处理(至少在Robotlegs中,我不能代表其他人)。这是因为,通常,您从未在Robotlegs中明确创建或销毁中介者;相反,您将介体与视图组件相关联,Robotlegs会不断监视正在添加和删除视图组件的阶段,并创建和销毁相应介体的实例。
因此,在PureMVC中实现此类事物的一种方法是使StageMediator将stage本身作为其视图组件,并侦听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!