Polymer firebase ..使用密码和电子邮件进行身份验证

时间:2017-01-25 09:48:45

标签: javascript firebase polymer-1.0 polymerfire firebase-polymer

我有一个成功登录用户的功能。

from binascii import unhexlify
from bitcoin.rpc Proxy
p = Proxy("http://rpcuser:rpcpass@127.0.0.1:8332")
h = unhexlify("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")
print(p.gettransaction(h))

我想要的是在用户成功登录时调用函数_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._animateView();

如果我尝试这样做,则返回undefined ..如何解决此问题

2 个答案:

答案 0 :(得分:1)

this的含义在回调函数中有所不同。

你可以通过多种方式解决这个问题,但这里有两个。

在另一个变量

中捕获此值

您无法阻止this获取新值,因为这只是JavaScript闭包的工作方式。但您可以做的是使用您需要的定义不同的值。该变量的惯用名称为self,但我个人更喜欢更具描述性的内容:

_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定义了一种使用所谓的胖箭头=>)声明函数的新方法。除了稍微减少代码之外,这些代码确保lambda / callback中this的值保持不变。所以

_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 :(得分:1)

除了@Frank van Puffelen的回答之外,聚合物开发团队还使用了另一种方法:

_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)