Чтобы ответить на ваш главный вопрос, нет, вам не нужно добавлять экземплярный экземпляр AS3 в список отображения, если вы хотите установить его свойства. Нет никакой разницы между созданием его в MXML и созданием его в AS3 ... если, конечно, компонент не был построен должным образом.
Команда Flex в Adobe (ранее Macromedia) провела много лет, дорабатывая оптимизации для архитектуры компонентов Flex. Есть две важные части этого дизайна, которые связаны с вашей проблемой:
Они спроектировали систему аннулирования и проверки, чтобы вы могли устанавливать множество свойств одновременно, но эффект от изменений не произойдет, пока вы не сделаете все свои изменения.
Когда компонент создается впервые, его дочерние элементы не создаются сразу. Существует оптимальное время для этого, и это после того, как компонент был добавлен в список отображения.
По сути, когда у вас есть различие в поведении между экземпляром экземпляра MXML и компонентом AS3, это потому, что компонент был создан без учета этих двух функций.
Компонент, который ведет себя неправильно, вероятно, делает что-то вроде этого:
private var label:Label;
public function get b():String
{
return this.label.text;
}
public function set b(value:String):void
{
this.label.text = value;
}
Проблема в том, что разработчик компонента не учел, что подкомпонент Label, возможно, еще не создан! Рекомендуется сохранить значение в переменной и сделать его недействительным для последующей передачи его подкомпоненту (цикл проверки не происходит до тех пор, пока компонент не инициализирован и не созданы дочерние элементы).
private var label:Label;
private var _b:String;
public function get b():String
{
return this._b;
}
public function set b(value:String):void
{
this._b = value;
this.invalidateProperties();
}
override protected function commitProperties():void
{
super.commitProperties();
this.label.text = this._b;
}
В качестве альтернативы, если вы создаете компонент MXML, вы можете сделать что-то подобное, но часто вместо привязки вместо системы проверки правильности используется:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Label text="{this.b}"/>
<mx:Script><![CDATA[
private var _b:String;
[Bindable]
public function get b():String
{
return this._b;
}
public function set b(value:String):void
{
this._b = value;
}
]]></mx:Script>
</mx:Application>