角度4设置模态字段中的焦点

Ale*_*dro 7 angular

在我的angular 4项目中,我需要在bootstrap-modal内部关注一些领域

这是模态:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
 <div class="modal-dialog">
  <div class="modal-content">
   <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">
    <i class="material-icons">clear</i>
    </button>
    <h4 class="modal-title">{{'checkpoint.table.dialog.title' | translate }}</h4>
   </div>
   <form #modelForm="ngForm">
  <div class="modal-body">
    <div class="row">
        <div class="col-md-8">
            <div class="form-group label-floating">

                <label class="control-label">{{'checkpoint.table.dialog.labels.name' | translate }}
                <span class="star">*</span>
                </label>
                <input class="form-control" id="name" name="name" required [(ngModel)]="checkpoint.name" #focus />

            </div>
        </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

我用普通按钮打开对话框

<button type="button" class="btn btn-info btn-lg" 
data-toggle="modal" data-target="#myModal">Open Modal</button>
Run Code Online (Sandbox Code Playgroud)

我已经尝试过一些解决方案,例如:

@ViewChild('focus') inputElement: ElementRef;
Run Code Online (Sandbox Code Playgroud)

并在打开模式时在按钮中:

this.inputElement.nativeElement.focus();
Run Code Online (Sandbox Code Playgroud)

要么:

$('#myModal').on('shown.bs.modal', function () {
      $('#focus').focus();
Run Code Online (Sandbox Code Playgroud)

但是在第一种情况下,inputElement未定义,在第二种情况下,没有任何反应

cod*_*ter 7

您将需要使用 setTimeOut 来锻炼..
虽然它不应该是未定义的并且您的 @ViewChild('focus') 代码看起来不错,但如果它不起作用,请尝试将名称从 focus 更改为其他名称.. .因为焦点也是关键字......

另外我建议不要混合使用 Jquery 和 Angular...这不是一个好的做法。

 setTimeout(() => {
        this.inputElement.nativeElement.focus();
 });
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢 setTimeout) (2认同)

Ger*_*ros 5

我为此写了一条指令,当模式打开时,输入字段会自动聚焦。

import { Directive, Input, ElementRef, AfterViewInit } from '@angular/core';

@Directive({
    selector: '[focus]'
})
export class FocusDirective implements AfterViewInit {
    @Input() focus: boolean;

    constructor(private element: ElementRef) {}

    ngAfterViewInit() {
        if (this.focus) {
            this.element.nativeElement.focus();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在html中将其用于:

<input type="text"
       (keyup)="search($event)"
       focus="true"
>
Run Code Online (Sandbox Code Playgroud)