Javascript Ionic 2,此.nav.push()未定义

Javascript Ionic 2,此.nav.push()未定义,javascript,ionic-framework,angular,ionic2,Javascript,Ionic Framework,Angular,Ionic2,我来自爱奥尼亚1号,我从爱奥尼亚2号开始。 当我在承诺后立即使用this.nav.push(NameOfTerPage)时,会出现一个错误,但当我在承诺函数authHandler之外使用this.nav.push时,该函数完全起作用: import {Page, NavController} from 'ionic-angular'; import {ItemDetailsPage} from '../item-details/item-details'; @Page(

我来自爱奥尼亚1号,我从爱奥尼亚2号开始。 当我在承诺后立即使用this.nav.push(NameOfTerPage)时,会出现一个错误,但当我在承诺函数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);
        }
      }
    }
你能帮我吗


谢谢。

在javascript对象中使用
这个
有点棘手,尤其是当涉及回调时。(我建议这样做)

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

您的问题的解决方案是将类“
this
发送到回调,这样
this
将是您认为应该的。因此,当您调用
authWithPassword
时,请执行以下操作:

ref.authWithPassword({
   email: form.controls.username.value,
   password: form.controls.password.value
}, this.authHandler.bind(this));
编辑
正如@Manu Valdés在评论中所建议的,如果您想避免使用
bind
,另一个选项是以以下方式定义
authHandler

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

这是因为在中,无论调用方是谁,他们的
This
都设置为外部执行上下文。

什么是未定义的
nav
push
?@yarons为了便于讨论,您将如何使用箭头语法(=>)来完成此操作,箭头语法应使
指的是实现函数的范围,而不是执行函数的范围?@ManuValdés而不是使用
绑定
,您可以这样定义回调
authHandler
authHandler=(error,authData)=>{…
。这也行。@yarons我想我更喜欢这种方法,不必显式地处理
这个
上下文。两种方法都是有效的。我想这是风格的问题。但我会将其编辑到回答中。嗨,如何将这个问题标记为答案?感谢所有帮助我回答这个问题的人。