Почему mxml не поддерживает конструкторы компонентов?

Почему язык mxml фреймворка Flex не поддерживает конструктор для компонентов или не принимает аргументы конструктора для компонентов? Насколько мне известно, невозможно объявить объект ActionScript в mxml, если он принимает аргументы конструктора. Мне любопытна причина. Это выбор дизайна Adobe или связано с тем, как работают декларативные языки? Например, почему бы не разрешить:

<myNameSpace:MyComponent constructor="{argArray}"/> 

person onosendai    schedule 22.09.2011    source источник
comment
возможно, это поможет: stackoverflow.com/questions/878043/   -  person Chris Ghenea    schedule 22.09.2011
comment
Спасибо Крису за невероятно быстрый ответ! Я больше искал причину, почему это невозможно, а не обходной путь - это то, что обычно невозможно в декларативных языках, и почему?   -  person onosendai    schedule 22.09.2011
comment
И как бы вы объявили более одного аргумента? Всегда есть они в массиве?   -  person J_A_X    schedule 22.09.2011


Ответы (2)


Дополнительную информацию по вашему вопросу можно найти в IMXMLObject справке API. Они не говорят точно, почему mxml не поддерживает конструкторы, но в нем говорится, что вы должны управлять своим mxml-компонентом посредством событий его жизненного цикла: preinitialize, initialize и creationComplete.

Я полагаю, что это дизайнерское решение, учитывая, что mxml транслируется непосредственно в код AS3 (вы можете скомпилировать свое приложение, добавив keep-generated-actionscript = true и посмотреть, что он создаст).

person Lasneyx    schedule 28.09.2011

Даже если класс определен в 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>
person CQ Bear    schedule 30.09.2013
comment
Большое спасибо за ответ, кажется, очень полезный подход. Попробую. - person onosendai; 02.10.2013
comment
Я бы изменил его на private const __new__():* = construct(); не только из-за синтаксического сахара, но и потому, что он должен быть неизменным. Еще я бы сделал construct()* функцию protected для наследования. - person Mr. Polywhirl; 07.01.2014