-1

これは設計上の問題です。

angularJS アプリがあります。
このアプリは、Service を使用して、サインイン機能を持つ API と通信します...

app.service('managerApiService', function($q){
    var myApi = new WWW_Wrapper(...);
    myApi.setInput('www-asynchronous', true);

    var defer = $q.defer();

    this.login = function(){
        ...
    };

    this.logout = function(){
        ...
    };

    this.getShops = function(){     
        ...
        return defer.promise;
    }
});

ユーザーのログイン/資格情報/情報を処理する別のサービス:

app.service('loginService', function(){
    this.credentials = {username: null, password: null };
    this.loginData = null; // comes from server during login...

    this.login = function(){
        ...
    };

    this.logout = function(){
        ...
    };
});

私の質問は:

  • LoginService注入managerApiServiceし、資格情報を更新する必要がありますか?
  • managerApiServiceクレデンシャルを注入LoginServiceして監視する必要がありますか ?
  • それらを 1 つのサービスにまとめる必要がありますか?

他のアイデアはありますか?

4

1 に答える 1

1

私が行う方法は、通常、API との通信を担当するサービスを 1 つ持つことですが、状態は気にしません。関心があるのは、リクエストを作成して結果を返すことだけです。次に、セッションを処理する別のサービスがあり、このサービスが状態 (ユーザー名、パスワードなど) を処理します。このサービス (セッション) は API サービスに注入され、そのメソッドを呼び出します。ただし、API はこのサーバーの存在を認識しません。

より詳細には、私は通常、バックエンドとの通信を担当するサービスを持っています (これは、managerApiService に似ていると思います)。このような:

app.service('managerApiService', [ '$q', function ( $q ) {
    this.login = function ( credentials ) {
        // ...
    };

    this.logout = function () {
        // ...
    };
} ] );

このサービスは、ログインまたはセッションに関連する情報を保存しないことに注意してください。

次に、セッションの維持を担当する別のサービスを使用します。つまり、現在のユーザー ID、ユーザーの情報、権限、またはその他必要なものを保存します。このサービスは、実際にログインを実行するタスクを以前のサービスに委任します。これは次のようになります。

app.service('loginService', [ 'managerApiService', function ( managerApiService ) {
    this.loginData = null;

    this.login = function ( credentials ) {
        return managerApiService.login( credentials ).then( /* ... */ );
    };

    this.logout = function () {
        ...
    };
} ] );

主な利点は何ですか: サーバーとの通信が抽象化されているため、サーバーの動作を変更でき、API サービスを更新するだけで済みます。または、新しいログイン プロバイダーを追加することもできます。アプリケーションはそれを知る必要さえありません。API が適切なリクエストを処理します。

基本的に、あなたは正しい道を進んでいます。私が行う唯一の違いは、資格情報を LoginService に保存するのではなく、ビューまたはコントローラーに保存することです。これは、ログイン画面だけでなく、アプリケーション全体で LoginService が有効なままであり、ログインが実行された後に資格情報をメモリに保存する必要がないためです。

エラーに関しては、サーバーが 400 や 401 などのエラー コードを返すようにします。次に、コントローラーで、.catch通常、エラーに対処するためにリッスンします。通常は、資格情報が間違っていることを示す一時変数をスコープに設定します。 .

于 2015-11-02T22:56:57.033 に答える