我知道这已经被覆盖了很多,但我似乎无法让它发挥作用。
如何从主类听到变量更改的子类?
package {
import flash.events.*
public class DataBase extends MovieClip {
private var _OPPONENTTYPE:int = 0;
public function DataBase() {
OPPONENTTYPE(1);
}
public function get OPPONENTTYPE():int {
return _OPPONENTTYPE;
}
public function set OPPONENTTYPE(num:int) {
_OPPONENTTYPE = num;
dispatchEvent(new Event(DataBase._OPPONENTTYPE));
}
这是我到目前为止对子类的看法,但我似乎无法弄清楚如何从Main()中听取这个变量,或者即使我正确地调度事件。
答案 0 :(得分:2)
假设Main有一个对Database类的引用,你可以这样做:
首先,在Database中声明一个公共const来保存事件的名称。这比在事件代码中使用字符串更好,因为它允许编辑器进行错误检查和自动完成。
public static const DATABASE_CHANGE:String = "onDatabaseChange";
现在修改你的setter以使用这个const:
public function set OPPONENTTYPE(num:int) {
_OPPONENTTYPE = num;
dispatchEvent(new Event(DataBase.DATABASE_CHANGE));
}
在Main中你需要监听事件(假设你已经实例化并引用了数据库):
databaseRef.addEventListener(Database.DATABASE_CHANGE,dbChangeHandler);
最后,在处理程序中,通过查看事件对象的目标(将是您的数据库类)或使用您在设置侦听器时使用的引用来检查OPPONENTTYPE的新值:
private function dbChangeHandler(evt:Event):void
{
//both lines output the same
trace(evt.target.OPPONENTTYPE);
trace(databaseRef.OPPONENTTYPE);
}
答案 1 :(得分:1)
执行此操作的一种好方法是为变量创建自定义事件类型
package {
import flash.events.Event;
public class VariableEvent extends Event{
public var variableName:object;
public var oldValue:object;
public var newValue:object;
static public var VALUE_CHANGE:String = "VALUE_CHANGE";
public function VariableEvent(variableName:String, oldValue:object, newValue:object, bubbles:Boolean = false, cancelable:Boolean = false){
super(VALUE_CHANGE, bubbles,cancelable);
this.variableName = variableName;
this.oldValue = oldValue;
this.newValue = newValue;
}
}
}
在MAIN类中添加事件处理程序/侦听器,其中包含对象的引用 mydispatcher 为
mydispatcher.addEventListener(VariableEvent.VALUE_CHANGE, variableChangedListener);
和MAIN类中的Handler函数将是
private function variableChangedListener(event:VariableEvent):void
{
Alert.show(event.variableName +"Changed From "+event.oldValue+" To "+event.newValue);
}
Dispatch Event就像mydispatcher
的变量值变化一样dispatchEvent(new VariableEvent("variableName",<old Value>, <changed/new Value>));
希望有所帮助