2012-04-21 10 views
0

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

しかし、私が持っている問題は、 '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; 
    } 

は、このちょっとの事は可能ですか?

eli

答えて

1

はい、それはかなり可能と驚くほど簡単です。

// 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; 
    } 
} 

この解決方法はthis answerに基づいています。

0

これも可能です。これに関する多くの話題があります。ここで、 "as3渡し変数"を検索してみてください。

一つの例は、基本的にあなたがそれに渡す他の引数を受け入れるために、それを変更するには、イベントハンドラを拡張できthis post

です。

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"); 
   } 

     } 

} 
+0

カスタムイベントを使用するにはカスタムURLLoaderクラスを書く必要があります:) – skozin

+0

URLLoaderを拡張するのは難しくないし、そこにはたくさんの例があります。http://www.mikechambers.com/blog/2008/09/ 12/urlloader-subclass-with-automatic-refresh-support /。私はこれは最高の解決策ですsayngではないが、作品とエレガントです。 – rcdmk

+0

とにかく、リンクには4つのソリューションがあります。 – rcdmk

0

もう一つの方法は、インライン関数を使用することです。私はthis linkにそれを見つけました。

このスタイルについての興味深いです何
button.addEventListener(MouseEvent.CLICK, function(e:MouseEvent){handleClickEvent(e,"Home")}); 
function handleClickEvent(e:MouseEvent,str:String) { 
    trace("Argument :"+str,"- Event target :"+e.target.name); 
} 

はあなたが本当のを呼び出すイベントハンドラとしてインライン関数を使って、あなたが望む任意の他と一緒にイベントを渡すことです:

は、基本的な考え方は以下のとおりです。あなたが望むハンドラ。かなりきちんとしています。私はそれを試したことはありませんが、それは私にはうまくいくように見えます。

+0

これは私が投稿したリンクからの例で、この場合の4つの解決策を示唆しています。 – rcdmk

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; 
} 
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) ; 
});