2011-06-28 8 views
1

私はactionscriptの新機能を使用しています。ActionScript 2.0のみをサポートするネットワークアプライアンスのコードを記述しています。actionscript 2.0でのメソッド呼び出しのタイミング問題XML onLoad()function

私はXMLフィードを読み込み、フィード(要約と詳細)から2つのテキストデータを抽出し、2つの別々のTextFieldとして表示し、それらのそれぞれの長さを知ってからTextFieldをサイズ変更して再配置しようとしています。

XMLのonLoad()メソッドを使用してフィードから値を抽出し、TextFieldに値を設定しました。 onLoad()メソッドの終わりに、私はクラスのプライベートresizeSummary()メソッドを呼び出すことができたと思っていましたが、onLoad()メソッドではわからないという理由で、 resizeSummary()メソッドが呼び出されました。

私はコードの後半でresizeSummary()を呼び出しますが、他の処理が完了するまでonLoad()が呼び出されないため、問題はありません。だから私は制御する方法がわからないというタイミングの問題があるようだ。

xmlのonLoad()関数のイベントで呼び出されたresizeSummary()メソッドを取得する方法がわかりました。

2番目に簡単な解決方法は、onLoad()が完了したときに通知を受けて、TextFieldのサイズを変更できるようにすることです。

私のクラスのコードスニペットがこの投稿の末尾に表示されます。

class Foo { 
// constructor 
function Foo() { 
    initSummaryTextField(); 
    getData(); 
} 

private function getData() { 
    var xmlData = new XML(); 
    xmlData.onLoad = function(success:Boolean): Void { 
    if (success) { 
     var summary:String = ''; 

     // successfully extracted summary text at this point and assigned value 
     // to TextField .text variable. So I am good to here. 

     // THIS CALL NEVER SEEMS TO BE MADE EVEN THOUGH TRACE STATEMENT 
     // IMMEDIATELY PRECEEDING IT DOES. 
     trace("About to call resizeSummary()"); 
     this.resizeSummary(); 
    } 
    } 
    xmlData.load("URL TO SERVICE"); 
} 


private function initSummaryTextField() { 
    // do stuff here to create new TextField() for summary 
} 
private function resizeSummary() { 
    trace("calling resizeSummary"); 
} 

}

答えて

1

resizeSummary(); 
this

ため

this.resizeSummary(); 

を交換してみ範囲はもはやクラスレベルではないのでのonLoad関数を参照しています。

+0

'これを'。 onLoad()関数定義内のresizeSummary()呼び出しから、スクリプトはコンパイルされません。私はmtasc ubuntuコンパイラを使用しています。エラーメッセージは、タイプ不明の変数resizeSummaryです。 – jspyeatt

1

私のクラスで定義された匿名のonLoad()関数では、明らかにクラスのメソッドと変数の可視性がありません。

私がしたことは次のとおりです。私はこのthisを参照するthisObjectローカル変数を追加し、無名関数内でアクセスすることができます。私は削除する場合

// ADDED THIS LINE TO CREATE A REFERENCE TO this OBJECT. Then withing my annonymous function I can reference thisObject internally. 
var thisObject:Foo = this; 

xmlData.onLoad = function(success:Boolean): Void { 
    if (success) { 
    var summary:String = ''; 

    // successfully extracted summary text at this point and assigned value 
    // to TextField .text variable. So I am good to here. 

    // THIS CALL NEVER SEEMS TO BE MADE EVEN THOUGH TRACE STATEMENT 
    // IMMEDIATELY PRECEEDING IT DOES. 
    trace("About to call resizeSummary()"); 
    thisObject.resizeSummary(); 
} 

}