从actionscript调用自定义组件中的mxml setter方法

时间:2009-02-04 15:43:50

标签: flex actionscript-3

我尝试在actionscript类的自定义组件的某个actionscript块中调用setter方法。

当我想通过使用时调用主应用程序时,我可以做到这一点;

Application.application.methodName();

但是如何从自定义组件调用方法?我的组件在我的组件包中,我尝试以下

components.customComponent.methodName()

然而它没有发生, 任何想法?


我的自定义组件的一个实例调用actionscript类,所以我不想在actionscript中再次实例化自定义类,我只想调用一个setter方法......

还有其他想法吗?

3 个答案:

答案 0 :(得分:2)

您不必将方法设为静态;这样做可能会毫无用处,因为你希望方法调用对组件的当前状态做一些事情,我猜测 - 使用它的一些数据,改变它的外观等等。你真正需要的是一个对象引用

由于Application.application位于传说中的显示列表的顶部(或实际上非常接近顶部),因此您应该能够从该点开始访问每个组件,然后traversing the Display List - 直到最终,在到达您的嵌套组件时,调用其公开定义的方法。

然而,我必须(极其尊重!)说你冒险进入危险的OO水域。 :)正确的方法是找出将自定义组件的引用传递给需要访问它的ActionScript类的一些方法 - 例如,在你的MXML中:

<mx:Script>
    <![CDATA[

        private function this_creationComplete(event:Event):void
        {
            var yourObject:YourClass = new YourClass(yourCustomComponent);
        }

    ]]>
</mx:Script>

<components:YourCustomComponent id="yourCustomComponent" />

...然后在你的ActionScript类中:

public class YourClass
{
    private var componentReference:YourCustomComponent;

    public function YourClass(component:YourCustomComponent)
    {
        this.componentReference = componentReference;
    }

    private function yourMethod():void
    {
        this.componentReference.someMethodDefinedInYourComponent();
    }
}

这样的方法可能会更好地为您服务。是否有意义?我会留意我们的评论;回复后,我会尽力帮助你完成它。

答案 1 :(得分:0)

以这种方式引用组件需要该方法是静态的。

如果要在组件的实例上调用方法,请为其分配一个ID,并从您定义该组件的视图中调用它。

<!-- component declaration -->
<comps:MyComponent id="myComp"/>

// inside a script block
myComp.mySetter(someObj)

顺便说一句,ActionScript中的“setter方法”是使用以下语法定义的方法:

public function set myProperty(varName : String) : void { ... }

它可以被“调用:”就像你设置属性值一样:

myComp.mySetter = myObj;

在许多其他语言中,除了命名约定之外,“setter方法”与任何其他方法一样。值得理解的是,AS3中真正的setter方法是不同的。

答案 2 :(得分:0)

您需要确保引用该组件的实例,并尝试将其调用。所以在下面的例子中你可以看到我在类A的构造函数中创建了一个B的实例。所以现在我有一个B实例。现在我可以调用b.someMethod()

public class A
{
   public function A()
   {
      var b : B = new B();
      b.someMethod();
   }
}

public class B
{
   public function B()
   {
   }

   public function someMethod() : void
   {

   }
}

您可以将A类视为Application.mxml,将类b视为自定义组件。因此,无论您何时尝试调用它,都需要确保已创建组件。