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



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

将在某个位置重新安装的组件阵列:

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

在我的控制器中的某个时刻,当我需要一个全新的"登录表单"时:

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.generator属性强制转换为可以预期的属性,而不是它现在拥有的随机类名,而不是自定义ClassFactory?

编辑

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

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?

如果您使事件buddle并将处理程序移动到更高的级别:

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

相关内容

  • 没有找到相关文章

最新更新