代码之家  ›  专栏  ›  技术社区  ›  Hooray Im Helping codaddict

在ActionScript3中,如何将循环中数组的当前值传递给事件侦听器

  •  1
  • Hooray Im Helping codaddict  · 技术社区  · 16 年前

    代码示例:

    var gospels : Array = ["john", "mark", "matthew", "paul"];
    
    for each (var book : String in gospels)
    {
      var loader : URLLoader = new URLLoader();
      loader.load(new URLRequest("http://example.com/" + name));
    
      trace(book) // outputs current value of array
    
      loader.addEventListener(Event.COMPLETE, function(e : Event) : void {
        trace(book); // prints paul 4 times
      });
    }
    

    "john" , "mark" "matthew" ,及 "paul" ?

    4 回复  |  直到 16 年前
        1
  •  4
  •   Lior Cohen    16 年前
    var gospels:Array = ["john", "mark", "matthew", "paul"];
    
    for each (var item:String in gospels)
    {
      (function(book:String){
        var loader : URLLoader = new URLLoader();
        loader.load(new URLRequest("http://example.com/" + name));
    
        trace(book) // outputs current value of array
    
        loader.addEventListener(Event.COMPLETE, function(e:Event):void {
          trace(book); // prints paul 4 times
        });
      }(item));
    }
    
        2
  •  2
  •   Vincent Osinga    16 年前

    我认为更优雅的方法是编写URLLoader的超类,如:

    class MyURLLoader extends URLLoader {
      public var book:String;
    
      function MyURLLoader(aBook:String){
        book = aBook;
        super();
      }
    }
    

    然后在循环中使用此类,如:

    var gospels : Array = ["john", "mark", "matthew", "paul"];
    
    for each (var book : String in gospels)
    {
      var loader : MyURLLoader = new MyURLLoader(book);
      loader.load(new URLRequest("http://example.com/" + name));
    
      trace(book) // outputs current value of array
    
      loader.addEventListener(Event.COMPLETE, function(e : Event) : void {
        var myUrlLoader:MyURLLoader = e.target as MyURLLoader;
        trace (myUrlLoader.book);
      });
    }
    

        3
  •  1
  •   Markus Johnsson    16 年前

    Michael Brewer Davis答案的一个变体,但这里使用Array.forEach,并以这种方式引入一个新变量 book 对于每个迭代:

    var gospels : Array = ["john", "mark", "matthew", "paul"];
    
    gospels.forEach(function (book: String, i: int, a: Array): void {
      var loader : URLLoader = new URLLoader();
      loader.load(new URLRequest("http://example.com/" + name));
    
      trace(book) // outputs current value of array
    
      loader.addEventListener(Event.COMPLETE, function(e : Event) : void {
        trace(book); 
      });
    });
    
        4
  •  0
  •   rzetterberg    16 年前

    以下是最快和最好的结构化方法(imo):

    var gospels:Array = ["john", "mark", "matthew", "paul"];
    
    for(var book:String in gospels){ //For is faster than for each
        var loader:URLLoader = new URLLoader();
        //It's good practise to add the event listener before calling the function
        loader.addEventListener(Event.COMPLETE, loaderComplete(book), false, 0, true); 
        loader.load(new URLRequest("http://example.com/" + name));
    }
    
    function loaderComplete(book:String):Function{
        return function(event:Event):void{
            event.target.removeEventListener(Event.COMPLETE, arguments.callee);
            trace(book);
        }
    }
    
    推荐文章