2010-04-06 77 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(); 
    } 
}