“this” cannot be used in typescript function (Angular)

后端 未结 3 497
逝去的感伤
逝去的感伤 2020-12-12 02:01

I want to reference the keyword \"this\" in a typescript class in my Angular project. But it cannot be used. I always get the error that the variable I want to change is not

相关标签:
3条回答
  • 2020-12-12 02:28

    Since you're using Typescript, you can use arrow functions to preserve the context you expect (this will refer to what you want).

    In SubmitForm(), replace this.loggedIn with ()=>this.loggedIn(). The same change should be made to this.failed if that's a function.

    DBEventProxy.instance().dbevent.login(
        this.contactForm['username'], 
        this.contactForm['password'], 
        ()=>this.loggedIn(), 
        ()=>this.failed()
    );
    

    See the Typescript wiki

    Red flags for this

    The biggest red flag you can keep in mind is the use of a class method without immediately invoking it. Any time you see a class method being referenced without being invoked as part of that same expression, this might be incorrect.

    0 讨论(0)
  • 2020-12-12 02:32

    You need to bind loggedIn to the correct context. There are several options:

    1) define loggedIn as bound function:

    export class ContactComponent implements OnInit {
      loggedIn = () = > {
             this.redirect = "dashboard";
             console.log("success");`
    

    2) use bind

    export class ContactComponent implements OnInit {
      contactForm: FormGroup;
      errorMsg:string = '';
      redirect = "";
    
      loggedIn(): void {
             this.redirect = "dashboard";
             console.log("success");
    
        submitForm(): void {
            DBEventProxy.instance().dbevent.login(this.contactForm['username'], 
            this.contactForm['password'], this.loggedIn.bind(this), this.failed);
                                                        ^^^^^^^^^^
          }
    

    3) wrap this.loggedIn into an arrow function that preserves context like this:

    this.contactForm['password'], () => this.loggedIn(), this.failed);
    

    And probably you want to do the same for this.failed. Read more about bind and arrow functions here

    0 讨论(0)
  • 2020-12-12 02:36

    Instead of just referencing the function, you need to bind this to it: this.loggedIn.bind(this).
    Only referencing the function ' strips ' it off the this reference it has when referencing. This is standard Javascript behavior.

    0 讨论(0)
提交回复
热议问题