在没有引用实例的情况下将事件发送到popupmanager

时间:2011-04-25 17:46:13

标签: flex flex4 actionscript-3

我对Flex 4有相当的经验,但我还没有需要框架(我喜欢自己做所有事情)并且也不想使用它们,我知道它的优点并且已经学会了如何使用它其中,但仍然没有。

如何在主应用程序中调度事件并在弹出管理器中有一个组件来响应该事件?所有这些都在主应用程序中调度事件而不是将其瞄准弹出管理器或组件实例,我希望能够触发事件并且不关心谁获取它或者是否有人对它做出反应所以如果可能的话然后我不关心跟踪弹出窗口。

我已经从组件中调度了一个事件,并通过冒泡事件在主应用程序中接收它,因此彼此不可知,现在我想要它倒退。 注意:我使用过单身人士,但这不是我这次需要的方法。

3 个答案:

答案 0 :(得分:1)

听起来你迫切需要RobotLegs,你似乎在问如何创建/使用一个事件总线系统,以便分离你的组件,这正是机器人技术的惊人之处。

您还应该关注的一件事是ActionScript 3 Signals。信号是一种制作强类型事件(如.NET Framework)的方法,而不是魔术字符串事件系统,除了任何Flash / Flex项目之外,它还是一个非常棒的简单方法。

另一种常见的方式是中介/控制器单例模式。假设这是一个汽车应用程序,我们有一个服务层,幕后是从服务器接收一些数据,同时我们的弹出窗口显示后面。我们解决这个问题的一种方法是为我们的数据创建一个基于单例的控制器,如PartsController。它还有一些公共const信号,如SingalDataUpdated。弹出窗口现在可以执行PartsController.SignalDataUpdated.add(OnPartsUpdated)之类的操作。 OnPartsUpdated是弹出窗口中的本地方法,现在可以根据需要对事件做出反应,并且不与任何其他UI组件耦合。这通常是我们采用的方法,并确保没有UI组件具有任何其他UI组件的明确知识,而只是与控制器通信。但是,您需要确保的一件事是当弹出窗口关闭时删除信号列表。

然而,RobotLegs再次为您做了大部分工作,并鼓励一些非常伟大的建筑最佳实践。我强烈建议你仔细阅读他们的文档并熟悉它。当您意识到模块化和可维护性如何帮助您制作代码时,它将改变您的生活。

祝你好运!

有关背景和单身人士的更新 关于上下文的想法是创建一个单独的单例,称为应用程序的上下文,用于存储您的其他单例的实例。 Inversion of control(IoC)和RobotLegs只是将事物连接在一起所以它看起来不像绝对的废话,但你可以使用像SwizSwiftSuspenders这样的简单IoC注入器RobotLegs建立在。因此,例如,您可能会遇到一个特定的控制器,如:

AppContext.Instance.ProductController.SignalProductAdded.add(OnProductAdded);

但尝试以这种方式访问​​所有内容有点荒谬。 RobotLegs来救援。而是在RobotLegs上下文中定义注入规则,因此如果组件通过注入元数据标记请求UserController,则所有内容都将获得相同的UserController。完全像单身人士,但正确地在你的组件中定义;

[Inject] public var _objProductController:ProductController;

现在你的组件可以像控制器对象一样使用控制器对象,但是它在构造时由RobotLegs注入。对于我和我的大多数产品,我构建了一些基础对象,如GroupBasePanelBasePopupPanelBase等,它们扩展了适当的组件,并且已经具有所有控制器注入属性,因此任何从这些组件派生的组件已根据需要连接到适当的控制器。

对于您的简单项目,您可以更轻松地自行滚动,只需为您的上下文创建单个单例来保存控制器并以此方式与应用程序的上下文进行通信。这些都是相当高级别的建筑决策,每个人根据他们的经验,偏好或其他方式在这个级别上的工作方式不同。最重要的是它适合您,您对架构感到满意。 RobotLegs有助于使一切都非常分离,后来有一些令人惊讶的不可预见的好处。

祝你好运!

答案 1 :(得分:0)

如果我理解这个问题:

  

我如何在中发送一个事件   主要应用并有一个组件   在弹出管理员内部对此作出反应   事件

在弹出式组件中,您可以执行以下操作:

var app:Application = FlexGlobals.topLevelApplication as Application;
app.addEventListener('myCustomEvent',onMyCustomEvent);

现在,任何由主Application类调度的myCustomEvent实例都会在弹出窗口中触发处理程序。此外,任何冒泡到主Application类的myCustomEvent实例都将在弹出窗口中触发处理程序。

我不确定这是不是一个好主意。访问topLevelApplication会为弹出窗口添加外部依赖项,从长远来看可能会减少对所述组件的重复使用。访问topLevelApplication并不是我想不到的决定。

如果你试图提出另一个问题;从你的帖子中我不清楚,我发现有点令人困惑。

答案 2 :(得分:0)

进一步研究Flextras.com所说的内容(Jeffry Houser,我认为),这一壮举是不可能的,事件永远不会给孩子们起泡,只会给父母。 因此,这必须在中央事件存储库方法中完成,这是框架主要执行它的方式。

这确实是在某些框架中作为robotlegs发现的依赖注入所解决的问题之一。