ドキュメントから理解できるように、サービスは基本的にアプリケーションライフサイクルを通じて他のオブジェクトにサービスを提供するために使用されるシングルトンオブジェクトです。私は、ユーザがルート/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;私はこのことが実際にどのように作用するのかを知りたいので、どんな説明も感謝します。
ご理解の方が一般的です。これはあなたのサービスですか、それともアドオンのものですか?毎回サービスがインスタンス化されていることをどのように検出していますか?どのように移行していますか? – mwp
あなたのサービスメソッドでは、プロパティを取得および設定するために 'get'と' set'を使用する必要があります。残念ながら、プロパティが「ローカル」であるという理由だけで、これを回避することはできません。おそらくこれらのメソッドを更新し、問題が引き続き発生するかどうかを確認してください。 – mwp
@mwpそれを試して助けなかった。とにかくEmber.Objectのgetとsetメソッドはここでは使用しないデータバインディングとオブザーバのために必要です。 – DarthPaghius