Javascript Ionic 2,此.nav.push()未定义
我来自爱奥尼亚1号,我从爱奥尼亚2号开始。 当我在承诺后立即使用this.nav.push(NameOfTerPage)时,会出现一个错误,但当我在承诺函数authHandler之外使用this.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(
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我想我更喜欢这种方法,不必显式地处理这个上下文。两种方法都是有效的。我想这是风格的问题。但我会将其编辑到回答中。嗨,如何将这个问题标记为答案?感谢所有帮助我回答这个问题的人。