我在动作脚本中有点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元素?
答案 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”作为默认范围,这将使“自我”技巧变得不必要。