【问题标题】:Actionscript, objects and event listenersActionscript、对象和事件监听器
【发布时间】:2012-05-13 06:53:26
【问题描述】:

假设我有一个对象

var my_obj = new Object();
my_obj['key'] = value;

有没有办法给值添加一个事件监听器,比如

my_obj['key'].addEventListener(Blah Blah);

我在时间轴上有一个长长的(ish)按钮列表(布局因部分而异,所以在时间轴上做比尝试通过 actionscript 构建布局更有意义)。

button1 = plays "frame label 1"
button2 = plays "frame label 2"

等等....所以我只是想将所有内容存储在一个数组中

obj["button1"] = "framelabel1"
arr.push(obj);

然后我可以只为所有按钮设置一个事件处理程序,并使用 target 来获取框架标签值...

【问题讨论】:

  • 你能不能让我们停止猜测问题到底是什么? :)

标签: actionscript event-handling


【解决方案1】:

如果值为IEventDispatcher 或扩展EventDispatcher,您可以为其添加监听器。

【讨论】:

    【解决方案2】:

    这个问题对我来说相当模糊。我的猜测是每次设置值时都需要触发一些东西。如果是这种情况,那么您必须创建一个自定义类,并在那里声明一个 getter-setter 属性。

    例如:

    package
    {
        import flash.display.Sprite;
    
        public class TestAccessor extends Sprite
        {
            private var someVarValue:uint = 0;
    
            public function TestAccessor()
            {
                super();
            }
    
            public function get someVar():uint
            {
                return someVarValue;
            }
    
            public function set someVar(value:uint):*
            {
                someVarValue = value;
                // this is the place where someVar is set.
                // do whatever else you like here,
                // you may choose to dispatch an event from here if you need.
            }
    
        }
    }
    

    早在 AS1-AS2 时代,我们就有 watch()addProperty() 用于此目的,但这些时代早已一去不复返了。为了好。 :)

    【讨论】:

      【解决方案3】:

      是的,您可以按照您提到的确切方式完全按照您的要求进行操作,这是一个示例:

      var value:Sprite = new Sprite();
      
      var my_obj = new Object();
      my_obj['key'] = value;
      

      呼唤:

      my_obj['key'].addEventListener(Event.ENTER_FRAME, _onEnterFrameHandler);
      

      和调用完全一样:

      value.addEventListener(Event.ENTER_FRAME, _onEnterFrameHandler);
      

      【讨论】: