【问题标题】:Ionic 2, this.nav.push() is undefined离子 2,this.nav.push() 未定义
【发布时间】:2016-05-23 19:36:28
【问题描述】:

我来自 Ionic 1,我从 ionic 2 开始。 当我在 promise 之后立即使用 this.nav.push(nameOftheOterPage) 时出现错误,但是当我在 promise 函数 authHandler 之外使用 this.nav.push 时,此函数完全有效:

    import {Page, NavController} from 'ionic-angular';
    import {ItemDetailsPage} from '../item-details/item-details';

    @Page({
      templateUrl: 'build/pages/login/login.html'
    })
    export class LoginPage {
      static get parameters() {
        return [[NavController]];
      }

      constructor(nav) {
        this.nav = nav;
        this.firebaseUrl = "https://MYFIREBASE.firebaseio.com";
        this.authType = "login";
        this.error_username = false;
      }

      login(form) {
      if(form.controls.username.value === null){

        this.error_username = true;
      }
      else{
          /* Authenticate User */ 
          var ref = new Firebase(this.firebaseUrl);
          ref.authWithPassword({
            email    : form.controls.username.value,
            password : form.controls.password.value
          }, this.authHandler);
          }
        }

      authHandler(error, authData) {
        if (error) {
            console.log("Login Failed!", error);
        } else {
            console.log(authData);
            this.nav.push(ItemDetailsPage);
        }
      }
    }

你能帮我吗?

谢谢。

【问题讨论】:

  • 什么是未定义的? navpush?

标签: javascript ionic-framework angular ionic2


【解决方案1】:

this 在 javascript 对象中的使用有点棘手,尤其是在涉及回调时。 (我推荐这个interesting article 关于它)。

它的要点是,您始终需要跟踪哪个对象是调用该函数的对象,因为this 将绑定到调用对象。

你的问题的解决方案是bind你的班级'this到回调,这样this就会是你认为应该的。所以当你打电话给authWithPassword时,这样做:

ref.authWithPassword({
   email: form.controls.username.value,
   password: form.controls.password.value
}, this.authHandler.bind(this));

编辑
正如 @Manu Valdés 在 cmets 中所建议的那样,如果您想避免使用 bind,您还有一个选择是按以下方式定义 authHandler

authHandler = (error, authData) => {
    if (error) {
        console.log("Login Failed!", error);
    } else {
        console.log(authData);
        this.nav.push(ItemDetailsPage);
    }
}

这是因为在arrow functions 中,他们的this 被设置为外部执行上下文,无论调用者是谁。

【讨论】:

  • @yarons 为了讨论起见,你将如何使用箭头语法 ( => ) 来实现这一点,这应该使 this 指的是实现函数的范围而不是执行函数的范围?跨度>
  • @ManuValdés 而不是使用bind,您可以像这样定义回调authHandlerauthHandler = (error, authData) => {...。这也可以。
  • @yarons 我想我更喜欢这种方法,不必显式处理 this 上下文
  • 两种方式都有效。我想这是风格问题。但我会将其编辑为答案
  • 嗨,如何将此问题标记为答案?感谢所有帮助我回答这个问题的人。
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多