Apache flex 从操作更新外部Flex组件

Apache flex 从操作更新外部Flex组件,apache-flex,events,addeventlistener,dispatchevent,Apache Flex,Events,Addeventlistener,Dispatchevent,我是Flex新手,在理解事件方面有困难。我认为事件是我想用在我的处境中的。我有两个组件,addUser.mxml和listUsers.mxml。我从主应用程序中的ViewStack访问这些。当我加载listUsers.mxml时,它通过HTTPService调用显示数据网格中当前用户的列表。当我使用addUser.mxml上的表单添加用户时,我希望listUsers.mxml中的数据网格在返回该视图以显示新用户时刷新。我用addEventListener和dispatchEvent尝试了几种不同

我是Flex新手,在理解事件方面有困难。我认为事件是我想用在我的处境中的。我有两个组件,
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();" />
<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>

公共函数addUser():void{
if(validateForm()){
params={};
参数['action']='adduser';
params['firstName']=firstName.text;
params['lastName']=lastName.text;
params['email']=email.text;
params['isActive']=isActive.selected;
httpService.cancel();
httpService.addEventListener(“结果”,addUserResult);
httpService.send(参数);
}
}
公共函数addUserResult(事件:ResultEvent):无效{
变量结果:Object=event.result;
//如果添加用户成功,则重置字段
if(result.returnXML.action=='adduser'){
var m:String=result.returnXML.message.toString();
if(result.returnXML.status='fail'){
显示(m,null,Alert.OK,null,null,Application.Application.IconError);
}
如果(result.returnXML.status='success'){
firstName.text=“”;
lastName.text=“”;
email.text=“”;
isActive.selected=true;
显示(m,null,Alert.OK,null,null,Application.Application.IconSuccess);
}                   
}                   
}   
listUsers如下所示:

<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();" />
<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>

我不认为事件监听器是一种必然的选择。您可以使用事件侦听器在检测到其他内容时执行某些操作。ie)在ui组件上侦听鼠标按下=检测鼠标按下,执行拖动操作

给出你的例子,我认为你只需要把你的函数链接在一起。看起来addUser函数将用户保存到与列表用户从中获取数据相同的源,因此在您的位置,我将在addUser结果的末尾调用listUsers httpService以刷新填充datagrid的数据

httpListService.send()
我没有看到httpListService的结果处理程序,但这就是更新dataGrid中数据的地方


祝你好运,如果有任何问题,请发回。

成功了。下面是我所做的-基本上每次父viewstack聚焦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();
    }
}

...
公共函数init():void{
//vsUsers是主应用程序组件上的我的视图堆栈
Application.Application.vsUsers.addEventListener(IndexChangedEvent.CHANGE,refreshUsersGrid);
}
...
公共函数refreshUsersGrid(e:IndexChangedEvent):void{
//如果新的可查看子级是list users视图,则刷新datagrid
if(Application.Application.vsUsers.getChildAt(e.newIndex.name=='viewListUsers'){
//sendListUsersRequest方法激发HTTPService发送方法并将结果绑定到datagrid
sendListUsersRequest();
}
}

你能发布一些代码吗?很难知道如何帮助我们找到具体的工作。我在上面添加了一些代码,谢谢!httpListService的结果处理程序实际上就是我在listUsers组件中更新datagrid的地方。但是,addUser和listUsers是两个独立的组件。如果它们是同一组件中的两个函数,我理解您的意思,但是如何从addUser.mxml中的函数触发listUsers.mxml中的httpListService.send()方法呢?我在addUser.mxml中尝试了Application.Application.listUsers.httpListService.send()之类的东西,但它不喜欢这样。谢谢你的帮助!这里有一个问题,他们使用parentDocument从组件调用主应用程序上的方法,这可能会帮助您找到可以从子组件调用该方法的位置。