Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flex事件只会触发一次_Apache Flex_Air - Fatal编程技术网

Apache flex Flex事件只会触发一次

Apache flex Flex事件只会触发一次,apache-flex,air,Apache Flex,Air,在AIR应用程序中,我有一个私有变量和一个setter: private var _saveResult public function set saveResult( result:String ):void { _saveResult = result; dispatchEvent( new resultUpdatedEvent( _saveResult )); } 我第一次设置“saveResult”时,会触发事件。但除非我重新启动应用程序,否则它永远不会再次启动 如果我

在AIR应用程序中,我有一个私有变量和一个setter:

private var _saveResult
public function set saveResult( result:String ):void
{
    _saveResult = result;
    dispatchEvent( new resultUpdatedEvent( _saveResult ));
}
我第一次设置“saveResult”时,会触发事件。但除非我重新启动应用程序,否则它永远不会再次启动

如果我将setter更改为:

public function set saveResult( result:String ):void
{
    _saveResult = result;
    if ( result != null)
    {
        dispatchEvent( new resultUpdatedEvent( _saveResult ));
    }
}
问题消失了,我可以多次设置变量,每次都触发事件

我的问题:

我做错什么了吗?如果没有,谁能向我解释一下发生了什么事?如果是这样,我应该怎么做


谢谢

看起来您的事件构造不正确。事件对象的第一个参数应始终为字符串。因此,在本例中,您希望始终使用相同的字符串,以便可以侦听事件。resultUpdatedEvent类是什么样子的?您会希望它看起来像这样:

package myEvents
{
    import flash.events.Event;

    public class PropertyChangeEvent extends Event
    {
        public static const PROPERTY_CHANGE:String = "propertyChange";

        public var result:String = "";

        // Public constructor.
        public function PropertyChangeEvent (type:String, 
            result:String="") {
                // Call the constructor of the superclass.
                super(type);

                // Set the new property.
                this.result= result;
        }


        // Override the inherited clone() method.
        override public function clone():Event {
            return new PropertyChangeEvent(type, result);
        }
    }
}
这样,当您发送事件时,可以按如下方式构造事件:

new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, result);
这样,您就可以监听“PropertyChangeEvent.PROPERTY\u CHANGE”事件,它永远不会改变。现在的问题是,您的事件侦听器可能正在侦听由结果中保存的字符串表示的事件,显然,这在第一次设置后会发生变化,因此无法为其分配侦听器

有关事件在AS3中如何工作的更多信息:

请参阅注释。。。 没有事件调度器问题。 我误诊了这个问题,真正的问题是,如果你有一个[Bindable]属性,你使用setter,然后你将它设置为当前值,flex会忽略它。因此,您有几个选择:

1) 为getter和setter指定不同的名称。这似乎是个“坏主意”,但它确实解决了问题

2) 从类(我的问题)或属性中删除[Bindable]。如果类未实现IEventDispatcher,则需要这样做。您可以简单地“扩展Sprite”来查看它的工作情况,但作为解决方案,这似乎是一个“坏主意”,因此我根据本页末尾的示例实现了IEventDispatcher:


3) 我确信有一种方法可以绕过这个bug,但实际上我并不需要这个类是可绑定的,所以我没有找到解决方法

@quoo-wow。好球!我的活动结构不正确,谢谢你的提示但是现在我正确地调用了构造函数,仍然存在问题。我找到了。如果我有一个具有相同名称(saveResult)的getter和setter函数,那么我可以调用setter一次,任何后续调用都不做任何事情。事实证明这不是一个事件bug,但我还是学到了一些关于事件的知识,所以谢谢。我的setter/getter肯定有问题,但我看不出有任何问题。您确定设置了不同的值吗。如果设置相同的值,Flex将忽略它(以节省绑定时间)。@Amarghosh正确,或者如果整个类是[Bindable],这当然是问题所在所以,删除[Bindable],现在我无法调度事件,所以实现了IEventDispatcher。我应该在发布之前搜索更多。谢谢你的指点D