Создание Flex-объекта удваивает количество экземпляров - PullRequest
2 голосов
/ 31 января 2011

У меня есть следующее искровое приложение:

<?xml version="1.0" encoding="utf-8"?>
  <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" 
                        minHeight="600" xmlns:local="*">
        <local:TestComponent objects="{[new TestObject()]}">
        </local:TestComponent>
  </s:Application>

TestComponent:

package
{
  import mx.core.UIComponent;

  public class TestComponent extends UIComponent
  {
    public function TestComponent()
    {}
    public function set objects(array:Array):void
    {}
  }
}

TestObject:

package
{
  public class TestObject
  {
     public function TestObject()
     {}
     public function set objs(value:Array): void
     {}
  }
}

Я заметил, что конструктор TestObject вызывается2 раза, и создаются два экземпляра TestObject.

Последовательность создания выглядит следующим образом:

  1. Конструктор TestObject
  2. Конструктор TestComponent
  3. TestObjectвызывается конструктор
  4. TestComponent.objects (значение параметра содержит только один объект).

Если я создаю экземпляр TestObject, используя способ "element" в mxml:

<local:TestComponent>
  <local:objects>
     <local:TestObject>
     </local:TestObject>
  </local:objects>
</local:TestComponent>

Создан только один экземпляр TestObject.

Кто-нибудь может объяснить, почему создаются два объекта при использовании синтаксиса атрибута, а не синтаксиса элемента (который я считал одинаковым)?

1 Ответ

3 голосов
/ 31 января 2011

Два синтаксиса определенно не совпадают. Основное отличие состоит в том, что первый синтаксис заставит Flex реализовать привязку, а второй - нет.

Компилятор Flex берет все, что вы помещаете в волнистые скобки, и помещает его буквально в анонимную функцию, которую привязка вызывает при каждом выполнении. Конкретная причина, по которой конструктор вызывается дважды, заключается в том, что привязка выполняется дважды для элементов UIComponent, расположенных в списке отображения приложения, при запуске приложения. Первое выполнение происходит в конструкторе приложения, где изначально создаются все привязки (до события preinitialize). Второе выполнение привязки происходит при создании UIComponent. (Примечание. Число выполнений привязки, которые могут произойти до события applicationComplete, будет различным для разных компонентов, а также от того, какая привязка к ним имеется.)

Если вы хотите использовать привязку, но не создавать мусор при инициализации приложения, я бы порекомендовал что-то вроде:

<fx:Declarations>
    <local:TestObject id="testObject"/>
</fx:Declations>

<local:TestComponent objects="{[testObject]}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...