私のWebサービス呼び出しを処理するためにactionScriptクラスを書いています。結果を取得するときに、メインの mxml アプリケーションでセッター メソッドを呼び出したいと考えています。私の問題は、actionscript クラスからメイン mxml クラスの actionScript セクションのメソッドにアクセスする方法がわからないことです。何かアイデアはありますか?
3 に答える
David の言うとおりです。Application.mxml オブジェクトのパブリック メンバーには静的にアクセスでき、アプリケーションのどこからでもアクセスできますが、設計上、これは少しもったいないことです。オブジェクト間の疎結合を目指したほうがよいでしょう。Flex のイディオムで一般的に行われている方法は、EventDispatcher を拡張してイベントをディスパッチすることです。たとえば、WebService ラッパーは次のようになります。
public class MyWrapperClass extends EventDispatcher
{
[Event(name="webserviceComplete", type="flash.events.Event")]
public function MyWrapperClass(target:IEventDispatcher=null)
{
super(target);
}
private function handleWebServiceLoadComplete(event:ResultEvent):void
{
dispatchEvent(new Event("webserviceComplete"));
}
public function doWork():void
{
// Load the service, etc., and ultimately call handleWebServiceLoadComplete()...
}
}
...そして Main.mxml ファイルは次のようになります:
<mx:Script>
<![CDATA[
private function app_creationComplete(event:Event):void
{
var myWrapper:MyWrapperClass = new MyWrapperClass();
myWrapper.addEventListener("webserviceComplete", mywrapper_webServiceComplete, false, 0, true);
myWrapper.doWork();
}
private function mywrapper_webServiceComplete(event:Event):void
{
// Do the work you would've otherwise done in the public method
}
]]>
</mx:Script>
この場合、最終結果は同じです。Web サービスのロードが完了すると、Main.mxml の関数がトリガーされます。ただし、mywrapper_webServiceComplete()が非公開で宣言されていることに注意してください。 によって直接呼び出されるわけではありませんMyWrapperClass。Main.mxml は、MyWrapperClass が作業を終了したときに通知されるように ( を使用して) サブスクライブするだけaddEventListener()であり、その後、独自の作業を行います。webserviceCompleteMyWrapperClass は、Main.mxml の実装の詳細について何も知りません。また、Main.mxml は、イベントをディスパッチし、パブリックdoWork()メソッドを公開すること以外、MyWrapperClass について何も知りません。疎結合と情報隠蔽の動作。
幸運を!
クラスがコンポーネント ツリーに追加された UIComponent である場合、そのparentApplication属性を使用できます。それ以外の場合は、静的Application.application属性を使用しますが、アプリケーションの初期化が完了した後でのみ使用してください。それより前は、フィールドはnull. プライベート フィールドとメソッドには明らかにアクセスできません。明示的な s を使用して MXML 部分で宣言された要素idは public です。
ただし、このような呼び出しを追加すると、厳密なバインディングが作成されます。代わりにイベントをディスパッチし、メイン アプリケーションでこのイベントを処理することを検討してください。
誰かが同じ問題を抱えている場合:
mx.core.FlexGlobals.topLevelApplication.YOUR_FUNCTION
main.mxml 内のパブリック関数にアクセスするための構文です。