2012-04-26 19 views
0

考虑下面的代码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. 我怎么能看到Toolbar.mxmlcanvas VAR(和我可以)?
  2. 是否有可能pu <fx:Script source="Script.as" />,以便它可以从Toolbar.mxml看到。

回答

2
  1. 您将无法在Toolbar.mxml自动 “看” canvas。我会建议使用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

最好的办法是用-keep选项编译 - 这将产生从MXML模板编译实际AS3代码。

假设使用<Script source="script.as"/>不是一个好方法 - 这与在AS3中使用include "script.as"完全相同 - IDE不喜欢它,并且总的来说,它是一个混乱。如果您需要“后面的代码”,只需先在AS3中编写它,然后在MXML中扩展AS3类。

另一个需要了解的重要事项 - 每当您在MXML模板中使用id属性时,都会生成具有名称为id属性值的公共属性的类。因此,如果您将代码的某些部分移到您声明该属性的类(或MXML模板)之外 - 那么您可以像使用AS3类一样进行操作 - objectWithTheProperty.property