如何解决比较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>
在控制器中需要新的\“ 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属性强制转换/转换为可以预期的值,而不是它现在已经具有的某些随机类名?
编辑
无需比较两个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?
解决方法
如果使事件杂乱无章,并将处理程序移到更高的级别:
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。