在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 ));
}
}
问题消失了,我可以多次设置变量,每次都会触发事件。
我的问题:
我在这里做错了吗?如果没有,任何人都可以向我解释发生了什么?如果是这样,我应该做什么?
谢谢!
答案 0 :(得分:3)
看起来你正在构建错误的事件。 Event对象的第一个参数应始终为字符串。因此,在这种情况下,您希望始终使用相同的字符串,以便您可以监听事件。您的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_CHANGE”事件,该事件永远不会发生变化。问题是现在你的事件监听器可能正在侦听由结果中保存的字符串表示的事件,显然,这在第一次设置后会发生变化,因此无法为其分配监听器。
有关事件如何在AS3中工作的更多信息:http://livedocs.adobe.com/flex/3/html/help.html?content=events_02.html
答案 1 :(得分:1)
根据评论...... 没有事件调度员问题。 我误解了这个问题,真正的问题是如果你有一个[Bindable]属性并且你使用了一个setter,并且你将它设置为当前值,flex将忽略它。那么,你有几个选择:
1)给getter和setter不同的名字。看起来像是一个“坏主意”但它确实解决了这个问题。
2)从类(我的问题)或属性中删除[Bindable]。如果该类未实现IEventDispatcher,则需要执行此操作。您可以简单地“扩展Sprite”以查看它是否有效,但这似乎是一个“坏主意”作为解决方案,因此我根据本页末尾的示例实现了IEventDispatcher:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/events/IEventDispatcher.html
3)我确信有办法解决这个错误,但我实际上并不需要这个类是[Bindable]所以我找不到一个解决方法。