2008-11-20 73 views

回答

14

如果将它全部包装到一个类中,这很容易做到。我们将使用getter/setter方法。无论何时被调用,setter方法都会分派和事件。

(注意:Setters和Getters被视为属性)。你只是分配一个值,而不是调用一个方法(例如someVar = 5代替someVar(5);即使制定者/吸气剂函数/方法,他们像对待性质

//The document class 
package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    public Class TestDocClass extends Sprite 
    { 
    private var _model:Model; 

    public function TestDocClass():void 
    { 
     _model = new Model(); 
     _model.addEventListener(Model.VALUE_CHANGED, onModelChanged); 
    } 

    private function onModelChanged(e:Event):void 
    { 
     trace('The value changed'); 
    } 
    } 
} 

//The model that holds the data (variables, etc) and dispatches events. Save in same folder as DOC Class; 
package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    public class Model extends EventDispatcher 
    { 
    public static const VALUE_CHANGED:String = 'value_changed'; 
    private var _someVar:someVarType; 

    public function Model():void 
    { 
     trace('The model was instantiated.'); 
    } 

    public function set someVariable(newVal:someVarType):void 
    { 
     _someVar = newVal; 
     this.dispatchEvent(new Event(Model.VALUE_CHANGED)); 
    } 
    } 
} 
+1

是的 - 我很想看到一个这样的工作示例。我正在尝试加入一个命中测试。当用户在一个项目上时,有一个ENTER_FRAME监听器注册一个常量“命中”值,但是当它们关闭时,监听器改变注册一个常量“off”值。这种情况将如何适用于您的模型? – mheavers 2011-06-22 17:56:22

1

您曾经能够使用Object.watch在AS2中做类似的事情。我没有看到直接的等价物,但它看起来像mx.binding.utils.ChangeWatcher会给你任何可绑定变量的类似功能。我不知道如何在AS3中为非可绑定变量执行此操作,但是如果要观看的变量是可绑定的(或者如果您可以将其修改为可绑定变量),那么ChangeWatcher可能会为您提供什么你要。

2

@BrianHodge:你如何实际使用您的例如,你如何调用set函数?你如何引用它?在何处传递要更改的变量..?

比方说,如果我想用按钮单击来更改包装变量。 我必须承认,我尝试了一些其他代码和示例(getter/setter)类型,其中有dispatchEvent或者没有,我无法克服它!但是您的示例似乎正是我所需要的,但无法让它工作。

当我将函数设置为文档类时,我得到The model was instantiated。就这样。

我终于找到了像我这样的人,他们正在放弃这个派遣的事情!
在我的情况下,_someVar变量的数据类型必须为String(对于fornewVal也是如此)。

OnceTestDocClass设置为您的文档类;你指的实例是这样的模式:

_model.someVariable="new stuff"; 

我试图改变这样的价值:

_model.someVariable("new stuff"); 

您可以在Model类中添加某些微量元素的行动必须在一个清晰的演示输出面板:

package 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 

    public class Model extends EventDispatcher 
    { 
    public static const VALUE_CHANGED:String = 'value_changed'; 
    private var _someVar:String = "default"; 

    public function Model():void 
    { 
     trace('The model was instantiated.'); 
    } 

    public function set someVariable(newVal:String):void 
    { 
     trace ("before " + _someVar); 
     _someVar = newVal; 
     trace ("after " + _someVar); 
     this.dispatchEvent(new Event(Model.VALUE_CHANGED)); 
    } 
    } 
} 

这不是很多,但这些东西可以花费一些人一大堆的时间=)