"Это" не определено в тории-адаптере в Ember
Я пытаюсь сохранить некоторые данные после входа в магазин. Ниже приведен код моего torii-адаптера
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
};
});
}
});
Я получаю сообщение об ошибке: "TypeError: Невозможно прочитать свойство 'set' of undefined". Я также делаю инъекцию в магазине. Не могли бы вы сказать мне, что именно здесь происходит не так?
2 ответа
Решение
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
};
});
}
Чтобы получить дополнительное понимание и увидеть различные варианты (например, жирную стрелку или метод связывания), взгляните на этот вопрос.
Другой подход заключается в использовании функции стрелки ES6, так что вам не нужно назначать this
другая другая переменная.
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, чтобы сделать его совместимым с большинством браузеров.