0

我知道网上有一百万个关于 AS3 编译器错误的问题1120: Access of undefined property <property>,但这种情况很奇怪。

我正在<s:Application>为 Flex 4.6 中的一个组件设置皮肤,并且我在皮肤 MXML 文件中。该行super.addEventListener(Event.ADDED_TO_STAGE, positionObjects);给我的问题是:1120: Access of undefined property positionObjects。但是positionObjects在它的正下方声明。知道有什么问题吗?

<fx:Script>
    <![CDATA[
        /**
         *  @private
         */
        override protected function updateDisplayList(unscaledWidth:Number, 
            unscaledHeight:Number) : void
        {
            bgRectFill.color = getStyle('backgroundColor');
            bgRectFill.alpha = getStyle('backgroundAlpha');
            super.updateDisplayList(unscaledWidth, unscaledHeight);
        }

    //Listen for when objects are added to the stage, before positioning them
        [Bindable]
        private var logoX:Number = 0;

        super.addEventListener(Event.ADDED_TO_STAGE, positionObjects);

        private function positionObjects(e:Event):void {
            this.logoX = stage.stageWidth / 3;
        }
    ]]>
</fx:Script>

感谢您的时间。

4

2 回答 2

2

您不能在fx:Script块中具有可执行的实现,例如:

<fx:Script>
    super.addEventListener(Event.ADDED_TO_STAGE, positionObjects);
</fx:Script>

这应该从生命周期函数中调用,例如创建完成:

<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
        alpha.disabled="0.5"
        alpha.disabledWithControlBar="0.5"
        creationComplete="skin1_creationCompleteHandler(event)">

    <fx:Script fb:purpose="styling">
        <![CDATA[

            /* your implementation, same as before... */

            protected function skin1_creationCompleteHandler(event:FlexEvent):void
            {
                // move your event listener to this function.
                super.addEventListener(Event.ADDED_TO_STAGE, positionObjects);
            }
        ]]>
    </fx:Script>
</s:Skin>
于 2012-07-15T00:24:03.147 回答
0

我弄清楚了为什么我会出错。我没有考虑并假设我可以在初始化处理程序之外添加一个事件侦听器。出于某种原因,我认为 AS3 会<fx:Script>像解释器执行程序脚本一样通过编译标签运行。

出于某种原因,我再一次没有想到addedToStage要向标签添加一个属性<s:Skin>,并让它positionObjects从那里执行该方法。现在一切都很好。

于 2012-07-15T00:23:47.900 回答