为啥 mxml 不支持组件构造函数?
Posted
技术标签:
【中文标题】为啥 mxml 不支持组件构造函数?【英文标题】:Why doesn't mxml support component constructors?为什么 mxml 不支持组件构造函数? 【发布时间】:2011-11-22 12:33:19 【问题描述】:为什么 Flex 框架的 mxml 语言不支持组件的构造函数或接受组件的构造函数参数?据我所知,如果它采用构造函数参数,则无法在 mxml 中声明 ActionScript 对象。我很好奇原因。它是 Adobe 的设计选择还是与声明性语言的工作方式有关?比如为什么不允许:
<myNameSpace:MyComponent constructor="argArray"/>
【问题讨论】:
也许这会有所帮助:***.com/questions/878043/… 感谢 Chris 的快速解答!我更多的是寻找它不可能的原因,而不是一种解决方法 - 这是在声明性语言中通常不可能的事情吗?为什么? 你将如何声明多个论点?总是将它们放在一个数组中? 【参考方案1】:您可以阅读IMXMLObject help API 以获取有关您的问题的更多信息。他们没有确切说明为什么 mxml 不支持构造函数,但它说您必须通过其生命周期事件来控制 mxml 组件:预初始化、初始化和创建完成。
我认为这是一个设计决策,考虑到 mxml 会直接转换为 AS3 代码(您可以编译您的应用程序并添加 keep-generated-actionscript=true 并查看它会产生什么)。
【讨论】:
【参考方案2】:即使在 MXML 中定义了一个类,也可以通过实例化实例变量来实现构造函数,如下所示。这将在诸如“preinitialize”或“creationComplete”等各种事件被调度之前被调用。
<myNameSpace:MyComponent>
<fx:Script>
<![CDATA[
private var ignored:* = myInstanceConstructor();
private function myInstanceConstructor():*
// Do something - called once per instance
return null;
]]>
</fx:Script>
</myNameSpace:MyComponent>
此外,类变量的初始化方式类似如下。
<myNameSpace:MyComponent>
<fx:Script>
<![CDATA[
private static var ignored:* = myClassConstructor();
private static function myClassConstructor():*
// Do something - called once per class
return null;
]]>
</fx:Script>
</myNameSpace:MyComponent>
【讨论】:
非常感谢您的回答,这似乎是一种非常有用的方法。会试试看。 我会将其更改为private const __new__():* = construct();
不仅是因为语法糖,而且因为它应该是不可变的。我还将使construct()*
函数protected
用于继承。以上是关于为啥 mxml 不支持组件构造函数?的主要内容,如果未能解决你的问题,请参考以下文章