Actionscript-静态函数和UI元素的问题?

时间:2011-01-14 20:27:17

标签: actionscript-3 user-interface haxe static-functions

我在动作脚本中有点OOP。我有一个Display类来捕获视频流。我正在尝试创建一组基本的停止/录制按钮来控制相机。显然我不能声明访问this的函数或任何允许我识别和停止剪辑的变量。编译器(我正在使用Haxe)抛出错误:

video/Webcam.hx:96: characters 10-14 : Cannot access this from a static function

我可能会以错误的方式接近这一点。这是一些(缩写)代码:

class Webcam extends Display {

  var nc : flash.net.NetConnection;
  ...

  private function addControls(){
    var stopIcon = new StopIcon();
    var b = new flash.display.MovieClip();      
    b.addChild(stopIcon);
    b.useHandCursor = true;
    b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
      trace(this);
      this.stopStream()
    });
    b.x = 210;
    b.y = 20;
  }

  ...
}

我正在使用Haxe编译为AS3。这里有一个增量列表http://haxe.org/doc/flash/as2_compare似乎没有涵盖这个问题,所以我认为这是我与AS的问题。它可能与编译器有关,但我希望不是因为到目前为止我真的很喜欢Haxe。

如果actionscript编译器将这些函数视为静态,如何创建与对象实例关联的UI元素?

2 个答案:

答案 0 :(得分:2)

相信这是因为您在MouseEvent.CLICK处理程序中使用匿名函数而不使用Event本身。事件处理程序接受一个参数,即MouseEvent本身。因此,您可以执行以下操作之一:

b.addEventListener(flash.events.MouseEvent.CLICK, function($evt:MouseEvent) {
    trace($evt.target.parent);
    $evt.target.parent.stopStream();  // May require casting, but probably not
}

b.addEventListener(flash.events.MouseEvent.CLICK, __handleStopClick);

private function __handleStopClick($evt:MouseEvent):void {
    this.stopStream();
}

答案 1 :(得分:1)

另一种常见的方法是:

private function addControls(){
  ...
  var self = this;
  b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
    self.stopStream()
  });
  ...
}

优点是“自我”被正确输入并且不需要铸造。我们正在考虑在这种情况下添加“this”作为默认范围,这将使“自我”技巧变得不必要。