将ClassFactory.generator属性(来自mxml)与其原始Class进行比较

时间:2011-06-10 02:45:48

标签: flex reflection actionscript mxml

我在MXML标签中声明了一些组件,包含一些属性和事件处理程序。 对于其中一些需要重新实例化,所以我提出了以下架构。

将在某些点重新实现的组件数组:

<flint:forms>
    <fx:Component>
        <login:LoginForm loginClick="outerDocument.form_loginClick()" />
    </fx:Component>
    <fx:Component>
        <config:CustomizerWizard close="outerDocument.init()" />
    </fx:Component>
</flint:forms>

当我需要一个全新的“LoginForm”时,在我的控制器中的某个时刻:

public var form:LoginForm;
...
form = ReDo(LoginForm);

ReDo功能应如下所示:

public function ReDo(classe:Class):* {

    for each (var factory:ClassFactory in forms) {
        if (factory.generator == classe) return factory.newInstance();
    }
}

但它不能像我希望的那样工作。 Flex编译器为每个标记创建的类与其中声明的实际类不兼容。

我试图创建自己的标签,但编译器不会让我以同样的方式使用它。 (抱怨它不是容器)

有没有办法将自定义ClassFactory类与我可以在ReDo函数中使用的属性一起使用?像这样:

<flint:forms>
    <flint:MyComponent type="loginForm">
        <login:LoginForm loginClick="outerDocument.form_loginClick()" />
    </flint:Component>
    <flint:MyComponent type="wizard">
        <config:CustomizerWizard close="outerDocument.init()" />
    </flint:Component>
</flint:forms>

或者代替自定义ClassFactory,尝试将ClassFactory.generator属性转换/转换为可以预期的内容,而不是它现在拥有的一些随机类名?

修改

我可以实例化列表中的每个组件,并比较它是否是我想要的类型,而不是比较两个类变量(我认为它是最好的方法)。

public function ReDo(classe:Class):* {

    for each (var factory:ClassFactory in forms) {
        var obj:* = factory.newInstance();
        if (obj is classe) return obj;
        //if (factory.generator == classe) return factory.newInstance();
    }
}

这将是我的代码中唯一的变化,但这不是浪费吗? GC是否足够聪明以清理所有未通过“if”的obj?

1 个答案:

答案 0 :(得分:0)

如果您将事件发送并将处理程序移到更高级别:

addEventListener(LoginEvent.LOGIN_CLICK, ...);
addEventListener(WizardEvent.CLOSE, ...);

那么你基本上可以写:

<flint:forms>
    <login:LoginForm id="loginForm" />
    <config:CustomizerWizard id="wizard" />
</flint:forms>

然后:

public function ReDo(classe:Class):* {
    return new classe();
}

另一种(也是更正确的)方法是为每个组件使用单独的工厂函数:

public function createLoginForm():LoginForm {
    var loginForm:LoginForm = new LoginForm();
    loginForm.addEventListener(LoginEvent.LOGIN_CLICK, ...);
    return loginForm;
}