You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:52:50