Обновление внешних компонентов Flex из действия

Я новичок в Flex, и у меня проблемы с пониманием событий. Я думаю, что события - это то, что я хочу использовать в своей ситуации. У меня есть 2 компонента, addUser.mxml и listUsers.mxml. Я получаю к ним доступ из ViewStack в основном приложении. Когда я загружаю listUsers.mxml, он показывает список текущих пользователей в сетке данных через вызов HTTPService. Когда я добавляю пользователя с помощью формы на addUser.mxml, я хочу, чтобы сетка данных в listUsers.mxml обновлялась, когда я вернусь в это представление, чтобы показать нового пользователя. Я пробовал несколько разных вещей с addEventListener и dispatchEvent, но, похоже, это не работает. Может кто-нибудь помочь мне с этой логикой?

--

Пример кода для комментария, я разобрал не относительный материал.

adduser выглядит так:

<mx:HTTPService id="httpService" 
        url="{'http://someurl.com'}" 
        useProxy="false" 
        method="POST"
        fault="faultHandler()"      
        result="resultHandler(event)"
         />


public function addUser():void{  
            if(validateForm()){
                params = {};
                params['action'] = 'adduser';
                params['firstName'] = firstName.text;           
                params['lastName'] = lastName.text;
                params['email'] = email.text;
                params['isActive'] = isActive.selected;

                httpService.cancel();   
                httpService.addEventListener("result", addUserResult);                      
                httpService.send(params);
            }
}

public function addUserResult(event:ResultEvent):void{
            var result:Object = event.result;

            //reset fields if add user was successful
            if(result.returnXML.action=='adduser'){

                var m:String = result.returnXML.message.toString();                                 
                    if(result.returnXML.status=='fail'){                        
                        Alert.show(m, null, Alert.OK, null, null, Application.application.IconError);
                    }
                    if(result.returnXML.status=='success'){                     
                        firstName.text = "";            
                        lastName.text = "";
                        email.text = "";
                        isActive.selected = true;

                        Alert.show(m, null, Alert.OK, null, null, Application.application.IconSuccess);
                    }                   
            }                   
}   


<mx:Button id="addButton" label="Add" click="addUser();" />

listUsers выглядит так:

<mx:HTTPService id="httpListService" 
        url="{'http://someurl.com'}" 
        useProxy="false" 
        method="POST"
        fault="faultHandler()"      
        result="resultHandler(event)"
         />


<mx:DataGrid id="dgUsers"                         
                itemClick="dgClickEvent(event);"                          
                width="85%" 
                maxHeight="500"             
                >

                <mx:columns>
                    <mx:DataGridColumn headerText="First Name" dataField="fn" />
                    <mx:DataGridColumn headerText="Last Name" dataField="ln" />
                    <mx:DataGridColumn headerText="Email" dataField="email"  />
                    <mx:DataGridColumn headerText="Active" dataField="active" />
                </mx:columns>
            </mx:DataGrid>

person Scott    schedule 06.04.2010    source источник
comment
Вы можете разместить код? Трудно понять, как помочь без чего-то конкретного, с чем можно было бы работать.   -  person bedwyr    schedule 07.04.2010
comment
Я добавил код выше, спасибо!   -  person Scott    schedule 07.04.2010


Ответы (2)


Я не думаю, что слушатели событий - лучший вариант. Вы используете прослушиватель событий, чтобы делать что-то при обнаружении чего-то еще. т.е.) прослушивание нажатия мыши на компоненте пользовательского интерфейса = обнаружение опускания мыши, выполнение операции перетаскивания.

Учитывая ваш пример, я думаю, вам просто нужно связать свои функции вместе. Похоже, ваша функция addUser сохраняет пользователя в тот же источник, из которого пользователи вашего списка получают данные, поэтому в вашем положении я бы назвал listUsers httpService в конце результата добавления пользователя, чтобы обновить ваши данные, заполняющие сетку данных.

httpListService.send()

Я не вижу вашего обработчика результатов для httpListService, но именно там вы обновляете данные в своем dataGrid.

удачи, и, пожалуйста, отправьте ответ с любыми осложнениями.

person invertedSpear    schedule 07.04.2010
comment
обработчик результатов для httpListService действительно находится там, где я обновляю сетку данных в компоненте listUsers. Однако addUser и listUsers - это два отдельных компонента. Я понимаю, что вы говорите, если бы это были две функции в одном компоненте, но как мне вызвать метод httpListService.send () в listUsers.mxml из функции в addUser.mxml? Я пробовал что-то в addUser.mxml, например Application.application.listUsers.httpListService.send (), но мне это не понравилось. Спасибо за вашу помощь! - person Scott; 07.04.2010
comment
Вот вопрос, когда они вызывают метод в основном приложении из компонента, использующего parentDocument, возможно, это поможет вам добраться до того места, где вы можете вызвать этот метод из дочернего компонента. stackoverflow.com/questions/205359/ - person invertedSpear; 07.04.2010

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

в listUsers.mxml:

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">

...

public function init():void{
    //vsUsers is my view stack on the main application component
    Application.application.vsUsers.addEventListener(IndexChangedEvent.CHANGE, refreshUsersGrid);           
}

...

public function refreshUsersGrid(e:IndexChangedEvent):void{     
    //if the new viewable child is the list users view, then refresh the datagrid   
    if(Application.application.vsUsers.getChildAt(e.newIndex).name=='viewListUsers'){               
        //the sendListUsersRequest method fires the HTTPService send method and binds the results to the datagrid
        sendListUsersRequest();
    }
}
person Scott    schedule 08.04.2010