我在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?
答案 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;
}