0

考虑以下代码

<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. 我怎样才能看到canvasvar in Toolbar.mxml(我可以)?
  2. 是否有可能以某种方式 pu<fx:Script source="Script.as" />以便可以从Toolbar.mxml.
4

2 回答 2

2
  1. 您将无法canvasToolbar.mxml. 我建议使用 Flex 的事件架构来访问它。

    //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如果那是你需要的。如果您需要在父级范围内调用函数,我建议再次使用事件架构,而不是某种parent...Application.application...调用。

于 2012-04-26T16:04:23.587 回答
1

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

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

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

于 2012-04-26T19:22:10.587 回答