我有一个组件,我想从脚本部分调用它。
所以不要只是这样:
<s:application>
<script>
</script
<ns1:msns includeIn="login" x="482" y="541">
</ns1:msns>
</s:application>
我希望得到类似的东西:
<s:application>
<script>
protected function mmshakkoutab(event:MouseEvent):void
{
var ns1:msns:component = new component();
ns1:msns.x = 5
ns1:msns.x = 5
}
</script
</s:application>
这甚至可能吗?我一直在搜索,但所有的例子都给了我脚本下的组件。
答案 0 :(得分:1)
如果我理解得当,那么是的,这是可能的。你是“召唤一个组件”的术语是非标准的;但我认为你想用ActionScript而不是MXML创建组件。您可以使用ActionScript执行任何可以使用MXML执行的操作。
你有正确的想法;而你几乎就在那里;我会改变一些事情。首先,在ActionScript中导入类;你不会引用MXML命名空间,概念上如下:
import com.myPackage.msns;
在你的脚本块中。
创建组件时,您需要创建指向它的变量。这将对应于MXML中的id字段。您的ns1:msns:component
语法可能会导致编译器错误。但是,您可以像这样创建组件:
var msns :component = new component()
我在这里要提到的是,通常的惯例是大写组件名称。但是,使用小写在语法上并不是错误的。
然后在您正在执行的组件上设置属性:
msns.x = 5
msns.x = 5
最后 - 这是您缺少的步骤 - 您必须将新组件添加到容器中。如果您正在处理Spark容器,则可以使用addElement执行此操作;如果您正在处理MX容器,则可以addChild执行此操作。因为,在您提供的示例中,您的父容器是spark应用程序,我将使用addElement:
this.addElement(msns);
所以,你的代码块会像这样重写:
protected function mmshakkoutab(event:MouseEvent):void{
var msns:component = new component();
msns.x = 5
msns.x = 5
this.addElement(msns);
}
你应该考虑阅读的一件事是Flex Component LifeCycle。每个Flex组件都经历过它;某些事情按某种顺序完成,以达到某种目的。对于创建子项,您可能最好扩展createChildren(),尤其是如果您希望在应用程序标记的初始设置中创建组件时。
答案 1 :(得分:1)
要以编程方式实例化组件而不是声明性实现,请使用addElement()
将组件添加到显示列表中。
例如,要将可视元素添加到名为container
。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import mx.core.UIComponent;
import mx.events.FlexEvent;
protected function creationCompleteHandler(event:FlexEvent):void
{
var component:UIComponent = new UIComponent();
component.x = 5;
component.y = 5;
container.addElement(component);
}
]]>
</fx:Script>
<s:Group id="container" />
</s:Application>
在脚本块中,使用包命名空间而不是MXML命名空间。
import com.msns.Component;
var component:Component = new Component();
component.x = 5
答案 2 :(得分:0)
如果假设您的组件是ActionScript,即扩展为sprite,您可以这样做
protected function creationCompleteHandler(event:FlexEvent):void
{
var yourASClassObj:ASClass = new ASClass();
var component:UIComponent = new UIComponent();
this.addElement(component);
component.addChild(yourASClassObj);
}