如何在Apache Royale的Crux框架中为非Application视图注入Bean
Apache Royale Crux视图依赖注入失效问题
根据Crux文档,添加到显示列表的视图应支持Bean注入,但非Application类的MyView出现以下问题:
- 注入的
myModel始终为null [PostConstruct]标记的setUp方法未执行[EventHandler]无法处理事件
视图代码:
package views { import events.MyEvent; import models.MyModel; import org.apache.royale.events.Event; import org.apache.royale.jewel.ScrollableSectionContent; public class MyView extends ScrollableSectionContent { [Bindable] [Inject(source="myModel")] public var myModel:MyModel; public function MyView():void { super(); addEventListener("addedToStage", handleAddedToStageEvent); } [PostConstruct] public function setUp():void { // This is never called } [EventHandler(event="MyEvent.EVENT_TYPE", properties="data")] public function handleEvent(data:*):void { // Event is not handled here when fired } private function handleAddedToStageEvent(e:Event):void { // Get called whenever view is added to the display list // but myModel remains null } } }
Application的Crux配置:
<beads> <crux:JSStageEvents packageExclusionFilter="_default_"/> <crux:Crux> <crux:beanProviders> <config:Beans/> </crux:beanProviders> <crux:config> <crux:CruxConfig eventPackages="events.*" viewPackages="views.*"/> </crux:config> </crux:Crux> </beads>
解决要点
确保视图由Crux管理实例化:
不能手动用new MyView()创建实例,必须通过Crux获取:Crux.getInstance().getBean(MyView),或者在MXML中声明视图(Crux会自动扫描并管理MXML中的视图实例)。手动实例化的视图不会被Crux的注入机制处理。检查
JSStageEvents的包过滤规则:packageExclusionFilter="_default_"可能会意外排除目标视图包,建议修改为具体需要排除的包(如packageExclusionFilter="internal.utils"),或者暂时移除该属性测试,确保views.*包下的视图能被Crux扫描到。验证Bean的注册正确性:
确认config:Beans中已正确注册myModel:- 要么给
MyModel类添加[Bean(id="myModel")]注解 - 要么在
Beans类中显式声明Bean提供逻辑,确保Crux能找到ID为myModel的实例。
- 要么给
确认事件派发方式:
[EventHandler]依赖Crux的全局事件监听,事件需通过Crux.getInstance().dispatchEvent(new MyEvent(...))派发,或者事件需冒泡到Stage(确保事件的bubbles属性设为true)。如果是视图内部直接派发且不冒泡,Crux无法捕获。检查
PostConstruct方法规范:
确保PostConstruct标记的方法是无参public方法,用户代码中setUp符合要求,但需确认视图被Crux管理后,该方法才会在注入完成后触发。
内容的提问来源于stack exchange,提问作者duTr
相关产品推荐
相关产品推荐

