2017-06-16 3 views
0

ドキュメントから理解できるように、サービスは基本的にアプリケーションライフサイクルを通じて他のオブジェクトにサービスを提供するために使用されるシングルトンオブジェクトです。私は、ユーザがルート/users/loginを使用してログインした後に認証トークンを保存するために使用するユーザ管理サービスを持っています。しかし、別のルート(例えば/composer)に移行すると、サービスインスタンスが再作成され、格納されたすべてのデータが失われます。これは、アプリケーションが行う限り、またはライフサイクル全体のアイデアが間違っている限り、それが生き続けるべきであるという事実と矛盾していませんか?Ember.js経路遷移時に再作成されるサービスオブジェクト

私は以下のようにすべての私のルートにサービスを注入しています:

authenticationService: Ember.inject.service('authentication-service'), 

サービス自体がゲッターとセッターのセットのみである:ここでは

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    currentUser: undefined, 
    jwtToken: undefined, 
    // ================================================================================================================ \\ 
    // ================================================================================================================ \\ 
    // ================================================================================================================ \\ 
    setCurrentUser(user) { 
     this.currentUser = user ; 
    }, 
    getCurrentUser() { 
     return this.currentUser ; 
    }, 
    isLoggedIn() { 
     return Boolean(this.currentUser) ; 
    }, 
    getJwtToken() { 
     return this.jwtToken ? this.jwtToken : '' ; 
    }, 
    setJwtToken(jwtToken) { 
     this.jwtToken = jwtToken ; 
    } 
}); 

は、ログイン・トークンがどのようにあります扱い:

actions: { 
    onSubmitLoginForm() { 
     if (!this.validateLoginForm()) { 
      return ; 
     } 
     var self = this ; 
     Ember.$.post('login/', { 
      'username': this.controller.get('username'), 
      'password': this.controller.get('password'), 
      'email': this.controller.get('email'), 
     }, function(data) { 
      console.log(data) ; 
      if (data['success'] === 'Ok') { 
       self.get('authenticationService').setJwtToken(data['auth']['jwt']) ; 
       var user = self.get('store').createRecord('user', { 
        username: data['auth']['user']['username'], 
        email : data['auth']['user']['email'], 
        mongoId : data['auth']['user']['id']['$oid'], 
       }) ; 
       self.get('authenticationService').setCurrentUser(user) ; 
       self.transitionTo('home') ; 
       console.log('logged in') ; 
       console.log(self.get('authenticationService').getJwtToken()) ; 
       console.log(self.get('authenticationService').getCurrentUser()) ; 
       console.log(self.get('authenticationService').isLoggedIn()) ; 
      } else { 
       self.transitionTo('error') ; 
      } 
     }) ; 
    }, 
} 

私はInなどの他の永続性の手段の使用に関する提案を探していませんdexedDB;私はこのことが実際にどのように作用するのかを知りたいので、どんな説明も感謝します。

+0

ご理解の方が一般的です。これはあなたのサービスですか、それともアドオンのものですか?毎回サービスがインスタンス化されていることをどのように検出していますか?どのように移行していますか? – mwp

+1

あなたのサービスメソッドでは、プロパティを取得および設定するために 'get'と' set'を使用する必要があります。残念ながら、プロパティが「ローカル」であるという理由だけで、これを回避することはできません。おそらくこれらのメソッドを更新し、問題が引き続き発生するかどうかを確認してください。 – mwp

+0

@mwpそれを試して助けなかった。とにかくEmber.Objectのgetとsetメソッドはここでは使用しないデータバインディングとオブザーバのために必要です。 – DarthPaghius

答えて

2

はい、あなたはそれが正しいことを理解しています。サービスはシングルレットンなので、サービスはトランセッション間でその状態を維持します。しかし、移行するには、link-toヘルパーを使用する必要があります。手動でURLを変更している場合は、移行する代わりにアプリを再読み込みします。そして、アプリケーションの再読み込みはもちろん、状態のリセットを引き起こします。ページリロード間の状態を維持するには、使用可能な種類のストレージを使用する必要があります。

また、Emberでは、Emberオブジェクトにthis.currentUser = user ;というコードは使用しません。代わりにthis.set('currentUser', user);を使用します。さもなければ、Emberはテンプレートを再レンダリングしたり、計算されたプロパティを更新したり、適切に動作したりすることはできません。

最後に、ゼロから認証解を構築すべきではありません。それは非常に難しく複雑なことです。代わりに、ember-simple-auth addonを使用して、その上に認証プロセスを構築することができます。それははるかに簡単になり、結果はより信頼性が高くなります。

+0

キーポイントは '{{link-to}}'の使用でした。アプリケーションのいくつかの場所でhtmlアンカータグを使っていたようです。あなたの他の提案について私はaddonとaddonは正確な要件を満たしていれば良いものだと考えています。そうでなければ、それを修正するのは難しいプロセスでしょう。ご回答有難うございます。 – DarthPaghius

関連する問題