Пользовательский компонент Flex, лучший способ его использования

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

Предположим, у меня есть приложение 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 ... Я все неправильно понимаю? как я могу использовать больше компонентов, как будто все они являются частью одного приложения и использовать одни и те же переменные / методы?


person Marcx    schedule 01.12.2011    source источник


Ответы (1)


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

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

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

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

dispatchEvent(new Event('doLogin'));

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

person Amy Blankenship    schedule 01.12.2011