"Это" не определено в тории-адаптере в 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, чтобы сделать его совместимым с большинством браузеров.

Другие вопросы по тегам