正如我從文檔中瞭解到的,Service基本上是一個單例對象,用於通過應用程序生命週期向其他對象提供服務。我有一個用戶管理服務,用於在用戶使用路由/users/login
登錄後保存身份驗證令牌。但是轉換到另一個路由(例如/composer
)導致服務實例被重新創建,因此它將丟失所有存儲的數據。這與這個事實相矛盾嗎?只要應用程序確實存在或者我在整個生命週期中有什麼錯誤的想法,它就應該存在?Ember.js在路由轉換時重新創建服務對象
我注射服務在我所有的路線如下:
authenticationService: Ember.inject.service('authentication-service'),
該服務本身只是一組getter和setter:
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') ;
}
}) ;
},
}
我不是在尋找建議使用一些其他方式的持久性,如在dexedDB;我很樂意瞭解這件事實際上是如何運作的,所以任何解釋都會被讚賞。
你的理解一般是正確的。這是您的服務還是來自附加組件?你如何檢測到服務正在被實例化?你過得怎麼樣? – mwp
在您的服務方法中,您應該使用'get'和'set'來獲取和設置屬性。不幸的是,僅僅因爲屬性是「本地」並不意味着你可以避免這種情況。也許更新這些方法,看看你的問題是否仍然存在? – mwp
@mwp試過了,沒有幫助。無論如何,我不認爲它在這裏是必要的,因爲Ember.Object的get和set方法是爲了數據綁定和我們在此不使用的觀察者。 – DarthPaghius