2010-04-06 63 views
0

我是Flex新手,無法理解事件。我認爲事件是我想要用於我的情況。我有2個組件,addUser.mxmllistUsers.mxml。我從我的主應用程序中的ViewStack訪問這些。當我加載listUsers.mxml時,它通過HTTPService調用顯示數據網格中當前用戶的列表。當我使用addUser.mxml上的表單添加用戶時,我想在返回到該視圖以顯示新用戶時刷新listUsers.mxml中的數據網格。我用addEventListenerdispatchEvent嘗試了幾個不同的東西,但似乎無法讓它工作。有人可以用這個邏輯幫助我嗎?從動作更新外部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 2010-04-07 02:16:22

+0

我在上面添加了一些代碼,謝謝! – Scott 2010-04-07 13:29:57

回答

0

我不認爲事件監聽器是一定要走的路。您可以使用事件偵聽器來檢測其他內容。即)在UI組件上監聽鼠標=檢測鼠標向下,執行拖動操作。

鑑於你的例子,我認爲你只需要將你的函數鏈接在一起。它看起來像你的addUser函數將用戶保存到你的列表用戶從同一個源獲取數據,所以在你的位置,我會在添加用戶結果的末尾調用listUsers httpService來刷新填充數據網格的數據。

httpListService.send() 

我看不到您的httpListService的結果處理程序,但這是您更新dataGrid中的數據的地方。

祝你好運,請回復任何併發症。

+0

httpListService的結果處理程序確實是我更新listUsers組件中的datagrid的地方。但是,addUser和listUsers是2個獨立的組件。我明白你說的是,如果他們是同一個組件中的兩個函數,但是如何從addUser.mxml中的函數觸發listUsers.mxml中的httpListService.send()方法?我嘗試了一些addUser.mxml,如Application.application.listUsers.httpListService.send(),但它不喜歡那樣。謝謝你的幫助! – Scott 2010-04-07 15:44:48

+0

下面是一個問題,他們使用parentDocument從組件調用主應用程序的方法,也許這將幫助您到達可以從子組件調用該方法的位置。 http://stackoverflow.com/questions/205359/flex-call-function-from-included-component – invertedSpear 2010-04-07 15:59:05

0

得到它的工作。這就是我所做的 - 基本上每次父視圖堆棧都將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(); 
    } 
}