2017-02-26 52 views
0

我试图存储一些数据登录后店内。下面是我的torii-adapter的代码“这”是未定义的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:Can not read property'set'of undefined”。 我正在注入商店服务。你能告诉我这里究竟发生了什么问题吗?

+0

因为你在'ember-cli'我建议你使用箭头函数,这不会覆盖你的'this'上下文。我建议你告诉你自己JS的工作方式,以及为什么我们有箭头功能。另外,您不必手动创建第一个承诺,只需返回'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

另一种方法是使用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,使其与大多数浏览器兼容。