Сравните свойство ClassFactory.generator (из mxml) с его исходным классом. - PullRequest
0 голосов
/ 10 июня 2011

У меня есть некоторые компоненты, объявленные в тегах MXML, с некоторыми свойствами и обработчиками событий. Для некоторых из них требуется повторная реализация, поэтому я придумал следующую архитектуру.

Массив компонентов, которые будут повторно созданы в некоторой точке:

<flint:forms>
    <fx:Component>
        <login:LoginForm loginClick="outerDocument.form_loginClick()" />
    </fx:Component>
    <fx:Component>
        <config:CustomizerWizard close="outerDocument.init()" />
    </fx:Component>
</flint:forms>

В какой-то момент в моем контроллере, когда мне нужен новый "LoginForm":

public var form:LoginForm;
...
form = ReDo(LoginForm);

Функция ReDo должна выглядеть следующим образом:

public function ReDo(classe:Class):* {

    for each (var factory:ClassFactory in forms) {
        if (factory.generator == classe) return factory.newInstance();
    }
}

Но это не работает так, как мне бы хотелось. Класс, созданный компилятором Flex для каждого тега, несовместим с фактическим классом, объявленным в нем.

Я пытался создать свой собственный тег, но компилятор не позволил мне использовать его так же, как это возможно. (Жалуется, что это не контейнер)

Есть ли способ использовать пользовательский класс ClassFactory со свойством, которое я мог бы использовать в своей функции ReDo? Как это:

<flint:forms>
    <flint:MyComponent type="loginForm">
        <login:LoginForm loginClick="outerDocument.form_loginClick()" />
    </flint:Component>
    <flint:MyComponent type="wizard">
        <config:CustomizerWizard close="outerDocument.init()" />
    </flint:Component>
</flint:forms>

Или вместо пользовательского ClassFactory попробуйте привести / преобразовать свойство ClassFactory.generator к чему-то, что можно ожидать, а не к какому-либо случайному имени класса, которое у него сейчас есть?

Редактировать

Вместо того, чтобы сравнивать обе переменные класса (что я считаю лучшим подходом), я мог бы создать экземпляр каждого компонента в списке и сравнить, если это тот тип, который мне нужен.

public function ReDo(classe:Class):* {

    for each (var factory:ClassFactory in forms) {
        var obj:* = factory.newInstance();
        if (obj is classe) return obj;
        //if (factory.generator == classe) return factory.newInstance();
    }
}

Это было бы единственным изменением в моем коде, но разве это не расточительно? Будет ли GC достаточно умен, чтобы очистить все объекты, которые не проходят "если"?

1 Ответ

0 голосов
/ 10 июня 2011

Если вы делаете события buddle и перемещаете обработчики на уровень выше:

addEventListener(LoginEvent.LOGIN_CLICK, ...);
addEventListener(WizardEvent.CLOSE, ...);

тогда можно написать в основном:

<flint:forms>
    <login:LoginForm id="loginForm" />
    <config:CustomizerWizard id="wizard" />
</flint:forms>

А потом:

public function ReDo(classe:Class):* {
    return new classe();
}

Другой (и более правильный) подход заключается в использовании отдельной фабричной функции для каждого компонента:

public function createLoginForm():LoginForm {
    var loginForm:LoginForm = new LoginForm();
    loginForm.addEventListener(LoginEvent.LOGIN_CLICK, ...);
    return loginForm;
}
...