mxml模块和变量可见性

时间:2012-04-26 15:03:48

标签: actionscript-3 flash flex mxml

考虑以下代码

<fx:Script source="Script.as" />
......................
<s:Group>
    <s:layout>
        <s:HorizontalLayout/>
    </s:layout>
    <s:Spacer width="10" />
    <s:Button label="1" click="doSomething()"/>
    <s:Button label="2" click="holder.getCanvas().testDraw()"/>
    <s:Button label="3" click="doSomething()"/>
</s:Group>
<s:Scroller id="canvasGroup" width="650" height="500">
    <s:Group>
        <local:CanvasHolder id="canvas" />
    </s:Group>
</s:Scroller>

我想在一个单独的模块中移动按钮(让我们称之为Toolbar.mxml)。因此,我需要移动<fx:Script source="Script.as" />(在Script.as我也使用画布)。这是我的问题:

  1. 如何在canvas(我可以)中看到Toolbar.mxml var?
  2. 是否有可能以某种方式来<fx:Script source="Script.as" />以便从Toolbar.mxml看到它。

2 个答案:

答案 0 :(得分:2)

  1. 您将无法在canvas中自动“看到”Toolbar.mxml。我建议使用Flex的Event架构来访问它。

    //Extend Event class to hold any data that must be passed
    //from Toolbar -> canvas
    public class CustomEvent extends Event
    {
        public static const CUSTOM_EVENT:String = "CustomEventTypeString";
        public var mImportantInfo:String = "";
    
        public function CustomEvent();
        {
            super(CUSTOM_EVENT);
        }
    
        override public function clone():Event
        {
            var evt:CustomEvent = new CustomEvent();
            evt.mImportantInfo = mImportantInfo;
            return evt;
        }
    }
    
    //in Script.as
    myToolbarID.addEventListener(CustomEvent.CUSTOM_EVENT,customEventHandler);
    ...
    protected function customEventHandler(var evt:CustomEvent)
    {
        canvas.myFunction(evt.mImportantInfo);
    }
    
    //in Toolbar.mxml
    var evt:CustomEvent = new CustomEvent();
    evt.mImportantInfo = "canvas needs me!";
    dispatchEvent(evt);
    

    或者,您可以直接将画布对象传递给工具栏。

    <local:Toolbar ... myCanvas="{canvas}" ... />
    
    //in Toolbar.mxml
    public var myCanvas:CanvasHolder;
    ...
    myCanvas.myFunction(...);
    

    是的,第二个选项更简单,但是当需要交谈的组件不容易相互传递时,第一个选项通常很有用。

  2. 如果您需要,可以将<fx:Script source="Script.as" /> 放入 Toolbar.mxml。如果您需要在父级范围内调用函数,我建议您再次使用Event架构,而不是某种parent...Application.application...调用。

答案 1 :(得分:1)

了解您正在做的最好的方法是使用-keep选项进行编译 - 这将生成从MXML模板编译的实际AS3代码。

让我们说使用<Script source="script.as"/>不是一个好方法 - 这与在AS3中执行include "script.as"相同 - IDE不喜欢它,而且,一般来说,它是一个混乱。如果你需要“代码隐藏”,只需先在AS3中编写它,然后在MXML中扩展你的AS3类。

另一个需要理解的重要事项 - 每次在MXML模板中使用id属性时,生成的类都会生成一个公共属性,其名称为id属性的值。因此,如果您将代码的某些部分移到您声明该属性的类(或MXML模板)之外 - 您将按照与使用AS3类相同的方式进行操作 - objectWithTheProperty.property