通常情况下,生活会继续下去,但命运似乎总是如此,现在我需要删除监听器,但在使用匿名函数时这样做有点奇怪。因此,我再次尝试找出如何通过事件侦听器传递参数,以便可以通过引用函数来删除事件侦听器。
尽管这看起来很奇怪,但我也克服了这个问题并找到了解决方法,但我不喜欢它,也厌倦了使用它。在我看来,这是代码异味。但它像魔法一样工作。我将变量、对象或任何其他东西存储在派发 MovieClip 上。因此,如果我正在循环遍历数据数组,动态生成缩略图,我只需将数据变量(通常是具有多个属性的对象)存储在实际的缩略图 MovieClip 中。然后,我可以通过引用
event.target.data在事件侦听器方法中访问所有数据。在这个示例中,“数据”是保存我想要的信息的变量的名称。因为当我不使用这个方法时,会出现另一个问题,那就是当我循环遍历数组并生成缩略图以查看大图片时,索引不一致。在循环结束时,所有缩略图都将使用 “i” 的最后一个索引打开图像。所以如果我有一个长度为 12 的数组,它们都会加载第 12 张图片,无论你点击哪个缩略图。将数据存储到 MovieClip 本身中会创建一个永远不会更改的坚实参考。
这困扰着我有一段时间了。基本上我想知道的是,这是好的做法吗,是否有更好的解决方案?
以下是一些简要示例。如有必要,我可以发布更详细的示例。所有示例都描述了单击时加载大图像的缩略图。 不使用匿名函数(问题):
tempThumb.addEventListener(MouseEvent.CLICK, loadImage); public function loadImage(_event:MouseEvent):void { // 我没有变量_url,并准备用冷刀热浴 }
使用匿名函数:
tempThumb.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent) { loadImage("large.jpg"); } ); public function loadImage(_url:String):void { // 我获得了变量_url,并收起了剃刀 }
不使用匿名函数,而是使用我臭名昭著的小矮人技巧,将数据存储到MovieClip中并分派事件
tempThumb.data = "large.jpg";
tempThumb.addEventListener(MouseEvent.CLICK, loadImage); public function loadImage(_event:MouseEvent):void { trace(event.target.data); // 我可以访问该变量 }
我对编程术语不熟悉,所以我称上述为小矮人技巧。将变量存储/隐藏在对象中以供稍后使用/访问。它解决了我的所有问题,并且表现出色。但是,如果有更好的方法,我想知道那种方法。