0

私は正常にユーザーにログインする機能があります。私が欲しいものPolymer firebase ..パスワードとメールでの認証

_login: function() { 
    var email = this.$.emailvalue.value; 
    var password = this.$.passwordvalue.value; 

    return this.$.authenticate.signInWithEmailAndPassword(email, password).then(function() { 
     // Sign-in successful. 
     //this._animateView(); **returns undefined** 
    }, function(error) { 
     // An error happened. 
    //  // Handle Errors here. 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     console.log(errorMessage); 
     // this._animateErrorView(); **returns undefined** 
    }); 

    }, 

は、エラーが発生した場合、ユーザーが正常にログインするとthis._animateErrorView()時に機能this._animateView();を呼び出すことです。

私は

答えて

1

どのように私はこの問題を解決するのです...それはundefinedを返しますことを実行しようとした場合thisの意味は、コールバック関数が異なっています。

これはいろいろな方法で修正できますが、ここでは2つあります。

はそれがJavaScriptの閉鎖がどのように動作するか、単にだからあなたは、新しい値を得ることからthisを防ぐことはできません別の変数

にこの値をキャプチャします。しかし、あなたができることはで必要な値を定義することです。

_login: function() { 
    var email = this.$.emailvalue.value; 
    var password = this.$.passwordvalue.value; 
    var self = this;  
    return this.$.authenticate.signInWithEmailAndPassword(email, password).then(function() { 
     self._animateView(); 
    }, function(error) { 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     console.log(errorMessage); 
     self._animateErrorView(); 
    }); 
    } 

使用脂肪矢印機能

ES6は、いわゆる脂肪矢印で関数を宣言するための新しい方法を定義します(=>:私は個人的にもっと説明的なものを好むが、変数のための慣用名は、selfです)。若干コードが少なくなることを除けば、λ/コールバックのthisの値は変更されません。だから、@FrankバンPuffelenの答えに加えて

_login: function() { 
    var email = this.$.emailvalue.value; 
    var password = this.$.passwordvalue.value; 
    return this.$.authenticate.signInWithEmailAndPassword(email, password).then(() => { 
     this._animateView(); 
    }, (error) => { 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     console.log(errorMessage); 
     this._animateErrorView(); 
    }); 
    } 
1

、あらゆる場所にポリマーの開発チームによって使用されている別のアプローチもあります:

_login: function() { 
    var email = this.$.emailvalue.value; 
    var password = this.$.passwordvalue.value; 

    return this.$.authenticate.signInWithEmailAndPassword(email, password).then(function() { 
     // Sign-in successful. 
     //this._animateView(); **returns undefined** 
    }.bind(this), function(error) { 
     // An error happened. 
    //  // Handle Errors here. 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     console.log(errorMessage); 
     // this._animateErrorView(); **returns undefined** 
    }.bind(this)); 

    }, 

ので、基本的にあなたがですべてのコールバックに.bind(this)を追加します終わり。

関連する問題