从脚本中调用组件

时间:2013-02-21 01:26:26

标签: flex custom-component

我有一个组件,我想从脚本部分调用它。

所以不要只是这样:

<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>

这甚至可能吗?我一直在搜索,但所有的例子都给了我脚本下的组件。

3 个答案:

答案 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

的Spark组
<?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);
}