Vue.js在方法内失去范围

时间:2016-04-27 08:56:41

标签: javascript promise ecmascript-6 vue.js

我有一个在创建数据时请求数据的组件。但是,当返回数据时,我无法访问此父母范围内的任何内容。

// Service
class DataService {
  getDataFromService() {
    var p = new Promise(function(resolve, reject) {
      resolve({ message: 'hello world' });
    });
    return p;
  }
}
var dataService = new DataService();

// Component
Vue.component('review', {
  created: function() {
    this.fetchData();
  },
  methods: {
    fetchData: function() {
      var that = this;
      var hello = 'world';

      // normal function
      dataService.getDataFromService().then(function(data) {
        this.foo = data.message; // 'this' is undefined
        that.bar = data.message; // 'that' is undefined
        console.log(hello);      // 'hello' is undefined
      });

      // fat arrow
      dataService.getDataFromService().then((data) => {
        this.foo = data.message; // 'this' is undefined
        that.bar = data.message; // 'that' is undefined
        console.log(hello);      // 'hello' is undefined
      });
    },
  },
});

在上面的例子中,这个'这个'并且'那'是不确定的,我不知道为什么。我正在使用babel& browserify编译代码。

我尝试更改服务以使用回调而不是未改变任何内容的承诺。我也试过使用普通的"功能(数据)"而不是胖箭头功能。

更新 该示例适用于JSFiddle!我猜这意味着它与babel / browserify / modules有关。

2 个答案:

答案 0 :(得分:0)

使用箭头函数消除了块作用域,使用回调函数你必须使用self = this来使用它,但是不能在箭头函数中运行这个脚本并查看最新情况:

                var cb= function(f){
                    f();
                } 


                var fetchData = function() {
                    var that = this;
                    this.data ='data';

                     cb( () => {
                         console.log('---')
                        console.log(data);
                        console.log(that);
                    });
                }

答案 1 :(得分:-1)

我最终转而使用webpack来阻止问题的发生。