为啥 mxml 不支持组件构造函数?

Posted

技术标签:

【中文标题】为啥 mxml 不支持组件构造函数?【英文标题】:Why doesn't mxml support component constructors?为什么 mxml 不支持组件构造函数? 【发布时间】:2011-11-22 12:33:19 【问题描述】:

为什么 Flex 框架的 mxml 语言不支持组件的构造函数或接受组件的构造函数参数?据我所知,如果它采用构造函数参数,则无法在 mxml 中声明 ActionScript 对象。我很好奇原因。它是 Adob​​e 的设计选择还是与声明性语言的工作方式有关?比如为什么不允许:

<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 不支持组件构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不应该在Angular中组件的构造函数中进行数据初始化?

golang函数中的参数为啥不支持默认值

为啥使用 NGRX 而不是构造函数注入服务?

为啥Java没有复制构造函数?

MXML 类初始化顺序

为啥标准不将模板构造函数视为复制构造函数?