2016-04-27 2 views
-2

私は、作成時にデータを要求するコンポーネントを持っています。しかし、データが返されたときには、これに直接アクセスすることはできません。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 
     }); 
    }, 
    }, 
}); 

上記の例では、 'this'と 'that'の両方は定義されていません。理由はわかりません。私はコードをコンパイルするためにブラウザ&を使用しています。

何も変更していない約束の代わりにコールバックを使用するようにサービスを変更しようとしました。私はまた、太い矢印の代わりに通常の "関数(データ)"を使用しようとしました。

更新: 例はJSFiddleで機能します。私はこれがbabel/browserify/modulesと関係があることを意味していると推測しています。矢印の機能を使用して

+0

ES6の構文にアクセスできるため、関数リテラルを使用しないと時間がかかることがあります。 – christopher

+0

私は標準と太い矢印の両方の機能を試しました。どちらも違いはありませんでした。私はこの情報を含むように質問を更新しました。 –

+0

'this'は、非矢印関数の' that'とは異なる値を持っていたと理解できますが、 'hello'は未定義です。環境に重大なバグがあることを意味します。この動作はJavaScriptでは許可されていません。 – Bergi

答えて

-1

webpackは問題の発生を止めました。

0

は、これを使用するために、あなたが自己を使用する必要があり、コールバック関数=これで、ブロックスコープを排除しますが、矢印の機能は、このスクリプトを実行するとご覧にいただきましつもりはない:私はへの切り替え終わっ

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


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

        cb(() => { 
         console.log('---') 
         console.log(data); 
         console.log(that); 
        }); 
       } 
関連する問題