-1

私が基本的にやろうとしているのは、出力されたインスタンスの名前を変更することです。

しかし、私が抱えている問題は、渡された変数を関数「find_name」から「Event.Complete」関数 loadNameInfo に送信する方法です。

以下のコード:

    // Finds a persons name using the ID
    private function find_name(page_Name='search.php',instance_name='name',get1='g1=1',get2='g2=2',get3='g3=3'):void
    {
        var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
        var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3);
        _loader = new URLLoader();
        _request = new URLRequest(create_URL);
        _request.method = URLRequestMethod.POST;
        _loader.addEventListener(Event.COMPLETE, loadNameInfo);
        _loader.load(_request);
    }
    // Loads the name into the correct place
    public function loadNameInfo(e:Event)
    {
        instance_name.text = e.target.data;
    }

このようなことは可能ですか?

エリ

4

6 に答える 6

0

削除loadNameInfoして、無名関数をイベントリスナーとして使用します。

var that:* = this;   
_loader.addEventListener(Event.COMPLETE, function(e:Event):void{
     //you can access instance,which has 'instance_name' name, in 2 ways
     // 1. that[instance_name]
     // 2. that.getChildByName(instance_name)

     that[instance_name].text = e.target.data;
     //Removing anonymous listener from '_loader'
     e.target.removeEventListener(e.type, arguments.callee) ;
});
于 2012-04-21T09:00:17.003 に答える
0

カスタム値を URLLoader オブジェクトに添付することはできませんが、いくつかの回避策があります。

ローダーが 1 つしかない場合は、必要な値をクラス フィールドに格納するだけです。コンテンツを同時にロードするローダーが多数ある場合は、Dictionary オブジェクトを作成して URLLoader インスタンスを値に関連付けることができます。このようなもの:

private var _loaderValues:Dictionary = new Dictionary();

private function find_name(page_Name='search.php',instance_name='name',get1='g1=1',get2='g2=2',get3='g3=3'):void
{
    var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
    var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3);
    var loader:URLLoader = new URLLoader();
    var request:URLRequest = new URLRequest(create_URL);
    request.method = URLRequestMethod.POST;
    loader.addEventListener(Event.COMPLETE, loadNameInfo);
    loader.load(_request);
    _loaderValues[_loader] = {"pageName": page_Name, "instanceName": instance_name};
}

public function loadNameInfo(e:Event)
{
    var loader:URLLoader = e.target as URLLoader;
    instance_name.text = loader.data;
    var values:Object = _loaderValues[loader];
    trace(values["pageName"], values["instanceName"]);
    loader.removeEventListener(Event.COMPLETE, loadNameInfo);
    _loaderValues[loader] = null;
}
于 2012-04-21T01:56:25.387 に答える
0

これは可能です。これについては多くのトピックがあります。ここで「as3 変数をイベント ハンドラに渡す」を検索してみてください。

一例はこの投稿です

基本的に、イベント ハンドラーを拡張して、渡す別の引数を受け入れるように変更できます。

于 2012-04-21T01:49:13.483 に答える
0

カスタム イベントを作成できます。

http://www.learningactionscript3.com/2008/11/11/passing-arguments-with-events/

package {   
   import flash.events.Event; 
   public class CustomEvent extends Event {     
      public static const CUSTOM:String = "custom";     
      public var arg:*;     
      public function CustomEvent(type:String, customArg:*=null,
                              bubbles:Boolean=false,
                              cancelable:Boolean=false) {
     
         super(type, bubbles, cancelable);
     
         this.arg = customArg;
     
      }
       
      public override function clone():Event {
         return new CustomEvent(type, arg, bubbles, cancelable);
      }
 
      public override function toString():String {
         return formatToString("CustomEvent", "type", "arg",
                           "bubbles", "cancelable", "eventPhase");
      }

   }

}
于 2012-04-21T01:52:17.767 に答える
0

はい、かなり可能で、驚くほど簡単です。これを行う3行以上のコードは次のとおりです。

// Finds a persons name using the ID
private function find_name(page_Name = "search.php", instance_name = "name", get1 = "g1=1", get2 = "g2=2", get3 = "g3=3"):void {
  var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
  var create_URL = (URL + page_Name + randomParam + "&" + get1 + "&" + get2 + "&" + get3);
  _loader = new URLLoader();
  _request = new URLRequest(create_URL);
  _request.method = URLRequestMethod.POST;
  var functionLoadNameInfo:Function = loadNameInfo(page_Name, instance_name, get1, get2, get3);
  _loader.addEventListener(Event.COMPLETE, functionLoadNameInfo);
  // To remove you do: _loader.removeEventListener(Event.COMPLETE, functionLoadNameInfo);
  _loader.load(_request);
}

// Loads the name into the correct place
public function loadNameInfo(pageName:String, instance_name:String, get1:String, get2:String, get3:String):Function {
  return function(e:Event):void {
    instance.text = e.target.data;
    instance.name = instance_name;
  }
}

このソリューションは、この回答に基づいています。

于 2012-11-24T16:08:13.830 に答える
0

私が遭遇した別の方法は、インライン関数を使用することです。このリンクで見つけました。

基本的には次のような考え方です。

button.addEventListener(MouseEvent.CLICK, function(e:MouseEvent){handleClickEvent(e,"Home")});
function handleClickEvent(e:MouseEvent,str:String) {
    trace("Argument :"+str,"- Event target :"+e.target.name);
}

このスタイルの興味深い点は、必要な実際のハンドラーを呼び出すイベント ハンドラーとしてインライン関数を使用して、必要なものと共にイベントを渡すことです。かなりきれい。試したことはありませんが、うまくいくようです。

于 2012-04-21T01:53:46.413 に答える