2017-04-23 34 views
0

我試圖將值設置爲userSessionStorage,當我從authenticate()函數訪問它時,它似乎正常工作。ember:TypeError:無法讀取未定義的屬性'set'

但是,它在.then()承諾中不起作用。

應用程序/控制器/ show.js

import Ember from 'ember'; 
import { storageFor } from 'ember-local-storage'; 

export default Ember.Controller.extend({ 
    session: Ember.inject.service('session'), 

    userSessionStorage: storageFor('user'), 

    authenticator: 'authenticator:custom', 

    actions: { 
    authenticate: function() { 
     var credentials = this.getProperties('identification', 'password'); 
     // ok 
     this.set('userSessionStorage.username', credentials.identification); 

     this.get('session').authenticate('authenticator:custom', credentials) 
     .then(function(){ 

      // error: TypeError: Cannot read property 'set' of undefined 
      this.set('userSessionStorage.username', credentials.identification); 

     }) 
     .catch((message) => { 
      console.log("message: " + message); 

      this.controller.set('loginFailed', true); 
     }); 
    } 
    } 
}); 
+2

將您傳遞給'then'的函數重寫爲保持'this'周圍值的箭頭函數。或者用'const self = this;'在'authenticate'方法的頂部捕獲'this'的這個值,然後使用'self.set'。 – 2017-04-23 04:47:48

+0

@torazaburo你很好:)你可以請把這個作爲答案,以便我可以把它作爲正確的答案? –

+0

爲什麼不在你的驗證器中設置'userSessionStorage.username'? –

回答

1

所有你需要做的是改變以下行:

this.get('session').authenticate('authenticator:custom', credentials) 
     .then(function(){....} 

使用脂肪箭頭標記,如下所示:

this.get('session').authenticate('authenticator:custom', credentials) 
     .then(()=>{....} 

這樣this承諾上下文內的上下文將成爲您的控制器。有關ES6箭頭功能的更多信息,請參閱following

1

它是基於我自己的代碼,那麼你可能需要去適應它。但是,在你的認證,你authenticate功能可能是這樣的:

# authenticator 

authenticate(credentials) { 
    const { identification, password } = credentials; 
    const data = JSON.stringify({ 
    auth: { 
     email: identification, 
     password 
    } 
    }); 

    const requestOptions = { 
    url: this.tokenEndpoint, 
    type: 'POST', 
    data, 
    contentType: 'application/json', 
    dataType: 'json' 
    }; 

    return new Promise((resolve, reject) => { 
    ajax(requestOptions).then((response) => { 
     // Set your session here 
    }, (error) => { 
     run(() => { 
     reject(error); 
     }); 
    }); 
    }); 
}, 
相關問題