0

リモートデータサービスとのすべての対話を処理するremoteobjectクラスがあります。呼び出しが行われるたびに、データサービスはユーザーが有効なセッションを持っていることを確認します。そうでない場合、要求されたメソッドは実行されず、失敗が返されます。この失敗をフォールトハンドラーでキャプチャできます。それが起こったら私がやりたいのは、ログイン画面をユーザーにプッシュすることです。

私は以下を試しました

            var navigator:ViewNavigator;
            navigator.activeView.navigator.pushView(views.LoginScreen);

しかし、これは機能せず、nullオブジェクト参照のプロパティまたはメソッドにアクセスできませんで失敗します。これは理にかなっています。だから私の質問は、現在実行中のビューナビゲーターオブジェクトへの参照を取得してビューをプッシュするにはどうすればよいですか?

ありがとう

ここで要求されるのは、完全なリモートオブジェクトクラスです

パッケージリモーティング{インポートevents.RemoteExceptionEvent;

import flash.events.*;

import mx.managers.CursorManager;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.rpc.events.FaultEvent;
import mx.rpc.remoting.RemoteObject;

import spark.components.ViewNavigator;

import views.FirstTime.ValidateUser;

/**
 * Super class for all remote services that contains some generic methods.
 */
public class RemoteService extends EventDispatcher

{
    private static var REMOTE_EXCEPTION:String = "Remote exception";
    private static var NO_MESSAGE:String = "10001";

    protected var remoteObject:RemoteObject;

    private var amfChannelSet:ChannelSet;

    /**
     * Constructor accepting an id and destination for the actual RemoteObject to create. An event listener
     * is added for exceptions.
     * @param id String representing the id of the new RemoteObject to create
     * @param destination String representing the destination of the RemoteObject to create
     * @param amfChannelId String representing the Channel of the RemoteObject to create
     * @param amfChannelEndpoint String representing the Endpoint URI of the RemoteObject to create
     */
    public function RemoteService( serviceId:String
                                   , serviceDestination:String
                                     , amfChannelId:String
                                       , amfChannelEndpoint:String
    ) 
    {
        // Create a runtime Channelset for given Channel ID and Endpoinr URI
        var amfChannel:AMFChannel = new AMFChannel(amfChannelId, amfChannelEndpoint);
        amfChannelSet = new ChannelSet();
        amfChannelSet.addChannel(amfChannel);

        // Create the remoteObject instance
        this.remoteObject = new RemoteObject(serviceId);
        this.remoteObject.channelSet = amfChannelSet;
        this.remoteObject.destination = serviceDestination;
        this.remoteObject.addEventListener(FaultEvent.FAULT,onRemoteException);
        this.remoteObject.setCredentials('test','test');

    }

    /**
     * generic fault event handler for all remote object actions. based on the received message/code an action
     * is taken, mostly throwing a new event.
     * @param event FaultEvent received for handling
     */
    public function onRemoteException(event:FaultEvent):void {
        trace('code : ' + event.fault.faultCode +
            ', message : ' + event.fault.faultString +
            ',detail : ' + event.fault.faultDetail);

            trace('fodun: ' + event.fault.faultDetail.indexOf("Authentication"));

        if (event.fault.faultDetail.indexOf("Authentication") > 0)
        {

            var navigator:ViewNavigator;

             navigator.activeView.navigator.pushView(views.LoginScreen);



        }
        else  if (event.fault.faultString == REMOTE_EXCEPTION) {
            EventDispatcher(
                new RemoteExceptionEvent(RemoteExceptionEvent.REMOTE_EXCEPTION,
                    "unknown problem occurred during a remote call : " + event.fault.message));
        } else if (event.fault.faultCode == NO_MESSAGE) { 
            EventDispatcher(
                new RemoteExceptionEvent(RemoteExceptionEvent.REMOTE_EXCEPTION,
                    event.fault.faultString));
        } else {

            EventDispatcher((
                new RemoteExceptionEvent(RemoteExceptionEvent.REMOTE_EXCEPTION,
                    "unknown runtime problem occurred during a remote call : " + event.fault.message)));
        }
    }
}
}
4

1 に答える 1

0

RemoteServiceクラス内からビューやその他のビジュアルコンポーネントにアクセスすることは、MVCアプリケーションを処理するための良い方法ではありません。あなたがしたいのは、基本的に「認証に失敗しました」というイベントをRemoteServiceクラスにディスパッチすることです。次に、ビューで、このイベントをリッスンし、ログイン画面を表示する必要があると解釈します。見る ?

于 2011-11-16T11:02:26.700 に答える