Flex пользовательский компонент, лучший способ его использования - PullRequest
2 голосов
/ 01 декабря 2011

Я не совсем понял, как работают пользовательские компоненты ...

Предположим, у меня есть приложение Main.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx"
       xmlns:local="*">
    <fx:Script>
        <![CDATA[
            private var privateStr:String = "Stringa Private";
            public  var publicStr:String = "Stringa Public";
        ]]>
    </fx:Script>
    <local:AddUser height="100" width="500"/>   
    <s:Label id="lblText" x="120" y="120" width="418" height="115" text="!!!"/>                                    
</s:WindowedApplication>

И компонент AddUser.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"
    creationComplete="initialize_component()">  
    <fx:Script>
        <![CDATA[                                               
            public var btnName:String = "Login";
        private function initialize_component():void
        {
             login.label = btnName;              
            }
            private function doLogin():void
            {
             //some stuff here
            }

        ]]>
    </fx:Script>
    <s:TextInput id="txtuser" x="96" y="36"/>
    <s:TextInput id="txtpass" x="96" y="66"/>
    <s:Button id="login" x="96" y="96" width="128" click="doLogin()" />
</mx:VBox>

Я бы хотел, чтобы при нажатии кнопки (вход в систему) я получил publicStr / privateStr, которые находятся в main.mxml Я все неправильно понимаю? как я могу использовать больше компонентов, если они являются частью одного приложения и используют одни и те же переменные / методы?

1 Ответ

2 голосов
/ 01 декабря 2011

Похоже, у вас проблемы с идеей инкапсуляции. Дочерние компоненты не должны знать о родительских компонентах, а компоненты View не должны выполнять реальную работу, а только запрашивают работу у компонентов Controller. В очень простых проектах ваш компонент верхнего уровня может содержать логику контроллера, но многие люди предпочитают держать его отдельно даже в небольших проектах. Как это сделать, выходит за рамки этого ответа.

Итак, как родители и ребенок должны правильно общаться? Дочерние компоненты должны предоставлять свойства, которые родительский (или Framework, если вы чувствуете, что готовы использовать инфраструктуру внедрения зависимостей) может заполняться только теми данными, которые нужны дочерним компонентам.

Дочерние компоненты запрашивают работу от контроллера, генерируя события.

Итак, doLogin () будет содержать что-то вроде

dispatchEvent(new Event('doLogin'));

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

...