Angular 2 Focus on first invalid input after Click/Event

前端 未结 9 1829
不思量自难忘°
不思量自难忘° 2021-02-04 03:46

I have an odd requirement and was hoping for some help.

I need to focus on the first found invalid input of a form after clicking a button (not submit). The form is rath

9条回答
  •  不要未来只要你来
    2021-02-04 04:43

    This works for me. Not the most elegant solution, but given the constraints in Angular we are all experiencing for this particular task, it does the job.

    scrollTo(el: Element): void {
       if(el) { 
        el.scrollIntoView({ behavior: 'smooth' });
       }
    }
    
    scrollToError(): void {
       const firstElementWithError = document.querySelector('.ng-invalid');
       this.scrollTo(firstElementWithError);
    }
    
    async scrollIfFormHasErrors(form: FormGroup): Promise  {
      await form.invalid;
      this.scrollToError();
    }
    

    This works, allowing you to evade manipulating the DOM. It simply goes to the first element with .ng-invalid on the page through the document.querySelector() which returns the first element in the returned list.

    To use it:

    this.scrollIfFormHasErrors(this.form).then(() => {
      // Run any additional functionality if you need to. 
    });
    

    I also posted this on Angular's Github page: https://github.com/angular/angular/issues/13158#issuecomment-432275834

提交回复
热议问题