2017-02-26 5 views
0

일부 데이터 포스트 로그인을 상점에 저장하려고합니다. 아래는 내가 무엇입니까"this"는 토리 어댑터 in ember에서 정의되지 않음

import Ember from 'ember'; 
import {createToken} from 'myapp/utils/app-utils'; 

export default Ember.Object.extend({ 
    store: Ember.inject.service(), 

    open: function(authentication){ 
    let authorizationCode = authentication.authorizationCode; 
    let token = createToken(); 
    return new Ember.RSVP.Promise(function(resolve, reject){ 
     console.log(authentication); 
     Ember.$.ajax({ 
     url: 'http://localhost/getUserInfoWuthAuthCode.php', 
     data: { 'code': authorizationCode,token:token}, 
     success: Ember.run.bind(null, resolve), 
     error: Ember.run.bind(null, reject) 
     }); 
    }).then(function(data){ 
     let user = data.user[0]; 
     this.set('storage.token',token); //this is undefined 
     return { 
     user: user 
     }; 
    }); 
    } 

}); 

오류 내 도리 어댑터의 코드 "형식 오류가 : 속성을 읽을 수 없습니다 정의의 '설정'". 나는 상점 서비스도 주입 중입니다. 여기 정확히 무슨 잘못 될지 말해 줄 수 있겠 니?

+0

당신이'ember-cli'에 있기 때문에 당신이 화살표 함수를 사용하도록 추천합니다, 이것은'this' 컨텍스트를 덮어 쓰지 않을 것입니다. JS에서 'this'가 어떻게 작동하는지, 그리고 왜 화살표 기능이 있는지에 대해 스스로에게 알리는 것이 좋습니다. 또한 수동으로 첫 번째 약속을 만들 필요없이'Ember. $. ajax'의 결과를 반환하고'Ember.RSVP.resolve()'를 사용하면됩니다. – Lux

답변

0

this은 현재 컨텍스트에 정의되어 있지 않습니다. 다른 변수에 할당하십시오.

open: function(authentication){ 
    let authorizationCode = authentication.authorizationCode; 
    let token = createToken(); 
    let that = this; 
    return new Ember.RSVP.Promise(function(resolve, reject){ 
     console.log(authentication); 
     Ember.$.ajax({ 
     url: 'http://localhost/getUserInfoWuthAuthCode.php', 
     data: { 'code': authorizationCode,token:token}, 
     success: Ember.run.bind(null, resolve), 
     error: Ember.run.bind(null, reject) 
     }); 
    }).then(function(data){ 
     let user = data.user[0]; 
     that.set('storage.token',token); //this is undefined 
     return { 
     user: user 
     }; 
    }); 
    } 

더 이해를 얻으려면 다른 옵션을 볼 수 있습니다 (예 : 지방 화살표 방법 또는 바인드로), this question를 보라.

0

다른 접근법은 다른 변수를 this 할당 할 필요가 없도록 ES6 화살표 기능을 사용하는 것입니다.

open: function(authentication){ 
    let authorizationCode = authentication.authorizationCode; 
    let token = createToken(); 
    let that = this; 
    return new Ember.RSVP.Promise((resolve, reject) => { 
     console.log(authentication); 
     Ember.$.ajax({ 
     url: 'http://localhost/getUserInfoWuthAuthCode.php', 
     data: { 'code': authorizationCode,token:token}, 
     success: Ember.run.bind(null, resolve), 
     error: Ember.run.bind(null, reject) 
     }); 
    }).then((data) => { 
     let user = data.user[0]; 
     that.set('storage.token',token); 
     return { 
     user: user 
     }; 
    }); 
    } 

Ember-cli는 ES6에서 ES5로 변환하여 대부분의 브라우저와 호환되도록 도와줍니다.