为什么MXML不支持组件构造函数?

7
为什么 Flex 框架的 mxml 语言不支持组件构造函数或接受组件构造函数参数呢?据我所知,在 mxml 中无法声明带有构造函数参数的 ActionScript 对象。我很好奇这种设计的原因是什么,是 Adobe 的设计选择还是与声明式语言的工作方式有关?例如,为什么不允许:
<myNameSpace:MyComponent constructor="{argArray}"/> 

也许这会有所帮助:https://dev59.com/n0fRa4cB1Zd3GeqP-qGu - Chris Ghenea
谢谢Chris的超快回答!我更想知道为什么不可能,而不是一个变通方法——这在声明式语言中一般是不可能的吗?为什么? - Gunnar Karlsson
你如何声明多个参数?总是将它们放在一个数组中吗? - J_A_X
2个回答

6
您可以阅读IMXMLObject的帮助API,以获取有关您问题的更多信息。他们没有明确说明为什么mxml不支持构造函数,但是它说您必须通过其生命周期事件控制mxml组件:preinitialize、initialize和creationComplete。
我认为这是一个设计决策,考虑到mxml直接转换为AS3代码(您可以添加keep-generated-actionscript=true编译应用程序并查看它生成了什么)。

4
即使一个类是在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>

非常感谢您的回答,看起来是一个非常有用的方法。我会尝试一下。 - Gunnar Karlsson
我会将其更改为private const __new__():* = construct();,不仅是为了语法糖,而且因为它应该是不可变的。我还会将construct()*函数设置为protected以供继承使用。 - Mr. Polywhirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接