使用自定义事件从子组件更改变量的状态

Posted

技术标签:

【中文标题】使用自定义事件从子组件更改变量的状态【英文标题】:changing the state of the variable from the child component using custom event 【发布时间】:2012-12-04 18:18:52 【问题描述】:

这是主要应用程序

<?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
            verticalAlign="middle"
            backgroundColor="white" layout="absolute" initialize="init();"  xmlns:MyComp="screens.*" >
            <mx:Script>
                <![CDATA[
                import screens.MyEvent;

                    private function init():void
                    
                         systemManager.addEventListener("data_transfer",handleDataTransfer);

                    
                    private function handleDataTransfer(evt:MyEvent):void

               this.myViewStack.selectedIndex=1;

                 


                ]]>
            </mx:Script>


    <mx:ViewStack id="myViewStack" selectedIndex="0"  >
    <MyComp:Welcome />
        <MyComp:Screen id="fillPage" />
        </mx:ViewStack>
    </mx:Application>

这是我的欢迎组件

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"   >
<mx:Script>
    <![CDATA[
       private function changeHandler():void
        var myEVT:MyEvent = new MyEvent("data_transfer",false, true);
        this.dispatchEvent(myEVT);
       

    ]]>
</mx:Script>
 <mx:Button label="Fill The Form" id="fillForm" click="changeHandler()"/>           
</mx:Canvas>

这是我的 screen.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"  >
<mx:Label text="hai">
</mx:Label> 
</mx:Canvas>

这是 MYEvent.as

package screens

    import flash.events.Event;

    public class MyEvent extends Event
    

    public static const DATA_TRANSFER:String = "data_transfer";

        public function MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
        
            super(type, bubbles, cancelable);
        

    

我想通过单击欢迎 mxml 处的按钮来获取屏幕 mxml...我是初始学习者.. 但它不起作用..请帮助我..

【问题讨论】:

【参考方案1】:

由于您的自定义事件有 bubbling=false,它不会冒泡到 systemManager。试试:

var myEVT:MyEvent = new MyEvent("data_transfer", true, true);

或者,将侦听器添加到正在调度事件的对象:

welcomePage.addEventListener("data_transfer",handleDataTransfer);
....
<MyComp:Welcome id="welcomePage" />

第二种解决方案通常更好/更受欢迎 - 更少的事件冒泡是一件好事

【讨论】:

我们可以在不使用事件的情况下完成这项任务吗...在这种情况下,当单击按钮时(id=fillForm)我们可以编写 click="this.parent.myviewstack.currentIndex=1" 之类的东西这不使用自定义事件.. 是的,你可以 - 但事件的优点是它们更灵活。如果您决定重新排列组件的布局,则必须手动调整所有路径(this.parent.myComponent.etc)。

以上是关于使用自定义事件从子组件更改变量的状态的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Vue.JS 上捕获自定义事件

使用自定义 Hook 事件处理反应陈旧状态

我可以在自定义组件中禁用 CHANGE 事件吗?

如何在 Blazor 中编写自定义值更改事件处理程序?

微信小程序自定义事件

Vue自定义事件