TypeError:无法读取未定义()离子3的属性'toastController' [重复]

Posted

技术标签:

【中文标题】TypeError:无法读取未定义()离子3的属性\'toastController\' [重复]【英文标题】:TypeError: Cannot read property 'toastController' of undefined() ionic 3 [duplicate]TypeError:无法读取未定义()离子3的属性'toastController' [重复] 【发布时间】:2018-06-29 11:38:17 【问题描述】:

我是 ionic 新手,我想测试一个 firebase 登录并处理它(密码错误、找不到用户等...)。问题是当我单击登录按钮时,它总是告诉我ERROR TypeError: Cannot read property 'toastController'。我试图查看其他帖子,但我没有发现问题出在哪里。 完整的错误:

vendor.js:1703 ERROR TypeError: Cannot read property 'toastController' of 
undefined(…)defaultErrorLogger @ vendor.js:1703
ErrorHandler.handleError @ vendor.js:1764
IonicErrorHandler.handleError @ vendor.js:122703
next @ vendor.js:5729
schedulerFn @ vendor.js:4576
SafeSubscriber.__tryOrUnsub @ vendor.js:32170
SafeSubscriber.next @ vendor.js:32117
Subscriber._next @ vendor.js:32057
Subscriber.next @ vendor.js:32021
Subject.next @ vendor.js:39739
EventEmitter.emit @ vendor.js:4556
(anonymous function) @ vendor.js:5004
t.invoke @ polyfills.js:3
r.run @ polyfills.js:3
NgZone.runOutsideAngular @ vendor.js:4930
onHandleError @ vendor.js:5004
t.handleError @ polyfills.js:3
r.runTask @ polyfills.js:3
e.invokeTask @ polyfills.js:3
i.isUsingGlobalCallback.invoke @ polyfills.js:3
n @ polyfills.js:3

在登录函数中抛出错误。

export class HomePage 
  user =  as User;

  constructor(private toastController: ToastController, private afAuth: AngularFireAuth, public navCtrl: NavController) 

  

  async login(user: User)
    try 
      const result = this.afAuth.auth.signInWithEmailAndPassword(user.email, user.password)
      .catch(function(error) 
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        var foo;
        if (errorCode === 'auth/wrong-password') 
          foo = 
            message: 'Wrong password',
            duration: 3000,
            position: 'bottom'
          ;
         else if (errorCode === 'auth/user-not-found') 
          foo = 
            message: 'User not found',
            duration: 3000,
            position: 'bottom'
          ;
        
        else
        
          foo = 
            message: errorMessage,
            duration: 3000,
            position: 'bottom'
          ;
        

        this.toastController.create(foo).present();
      );
     catch (error) 
      //console.log(error.N);
    

  

  register()
    this.navCtrl.push("RegisterPage");
  

提前感谢您的帮助

【问题讨论】:

你没有其他事情可以标记重复的帖子(这个不是)?你的生活一定很好...... 【参考方案1】:

问题 When should I use Arrow functions in ECMAScript 6? 包含解决问题的线索。

一方面,您必须了解使用 function 关键字声明的函数的不同行为,另一方面是“箭头”函数。

在您使用的catch() 回调中:

.catch(function(error) 
    // ...
)

经典的 javascript function 语法创建一个新的执行上下文并将 this 绑定到它。这就是为什么稍后在您调用函数时:

this.toastController.create(foo).present();

this 不再指代您的类,而是指函数本身,并且该函数中显然没有toastController 属性,因此您在未定义的属性上调用create(),因此出现错误消息。

错误类型错误:无法读取属性“toastController”

如果您在回调中使用箭头函数语法,则不会在函数内部创建新上下文,this 将引用外部上下文:类的上下文。

.catch((error) => 
    // ...
)

我还建议您阅读:ES6 In Depth: Arrow functions

【讨论】:

以上是关于TypeError:无法读取未定义()离子3的属性'toastController' [重复]的主要内容,如果未能解决你的问题,请参考以下文章

离子框架中的 RaphaelJS:TypeError:无法读取未定义的属性“路径”

未捕获的类型错误:无法读取未定义离子的属性“substr”

Vue 3 + Vue Router 4:TypeError:无法读取未定义的属性(读取“推送”)

TypeError:无法读取未定义的属性“MyProperty”

TypeError:无法读取 Vue 中未定义的属性“id”

无法读取未定义的属性“getPicture” - 离子相机