2010-04-06 5 views
0

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

-

Пример кода для комментариев, я разобран вне неродственного материал.

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> 
+1

Вы можете разместить код? Трудно понять, как помочь с чем-то конкретным работать. – bedwyr

+0

Я добавил код выше, спасибо! – Scott

ответ

0

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

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

httpListService.send() 

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

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

+0

обработчик результата для httpListService действительно там, где я обновляю datagrid в компоненте listUsers. Однако addUser и listUsers являются 2 отдельными компонентами. Я понимаю, что вы говорите, если они были 2 функциями в одном компоненте, но как я могу вызвать метод httpListService.send() в listUsers.mxml из функции в addUser.mxml? Я попробовал что-то в addUser.mxml, например Application.application.listUsers.httpListService.send(), но ему это не понравилось. Спасибо за вашу помощь! – Scott

+0

Вот вопрос, когда они вызывают метод в основном приложении из компонента с помощью parentDocument, возможно, это поможет вам добраться туда, где вы можете вызвать этот метод из дочернего компонента. http://stackoverflow.com/questions/205359/flex-call-function-from-included-component – invertedSpear

0

Got it working. Вот что я сделал - в основном каждый раз, когда родительский viewstack придает объекту listUsers фокус, он отправляет httpListService и обновляет datagrid независимо от любых событий (или не событий) в компоненте 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(); 
    } 
}