考虑以下代码
<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
我也使用画布)。这是我的问题:
canvas
(我可以)中看到Toolbar.mxml
var?<fx:Script source="Script.as" />
以便从Toolbar.mxml
看到它。答案 0 :(得分:2)
您将无法在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(...);
是的,第二个选项更简单,但是当需要交谈的组件不容易相互传递时,第一个选项通常很有用。
如果您需要,可以将<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
。