【问题标题】:mxml modules and variables visibilitymxml 模块和变量可见性
【发布时间】:2012-04-26 15:03:48
【问题描述】:
考虑下面的代码
<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 中我也使用画布)。这是我的问题:
- 如何在
Toolbar.mxml 中看到canvas var(我可以)?
- 是否有可能以某种方式 pu
<fx:Script source="Script.as" /> 以便可以从 Toolbar.mxml 看到它。
【问题讨论】:
标签:
actionscript-3
flash
apache-flex
mxml
【解决方案1】:
-
您将无法在Toolbar.mxml 中自动“看到”canvas。我建议使用 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(...);
是的,第二个选项更简单,但是当需要通信的组件不容易相互传递时,第一个选项通常很有用。
如果你需要的话,你可以把<fx:Script source="Script.as" /> in Toolbar.mxml。如果您需要调用父级范围内的函数,我建议再次使用事件架构,而不是某种parent... 或Application.application... 调用。
【解决方案2】:
了解您在做什么的最佳方式是使用-keep 选项进行编译 - 这将生成从 MXML 模板编译的实际 AS3 代码。
假设使用 <Script source="script.as"/> 不是一个好方法 - 这与在 AS3 中使用 include "script.as" 相同 - IDE 不喜欢它,而且总的来说,它很混乱。如果您需要“代码背后”,只需先在 AS3 中编写,然后在 MXML 中扩展您的 AS3 类。
要理解的另一件重要事情 - 每次在 MXML 模板中使用 id 属性时,生成的类都会有一个名为 id 属性值的公共属性。因此,如果您将代码的某些部分移到声明该属性的类(或 MXML 模板)之外 - 您将按照与 AS3 类相同的方式进行处理 - objectWithTheProperty.property。