【问题标题】:Angular 2 Material input focus not workingAngular 2材质输入焦点不起作用
【发布时间】:2017-09-16 05:00:11
【问题描述】:

输入位于模态对话框内。我不知道为什么它不起作用。我查看了官方文档,它列出了焦点作为您可以传递给元素但它不起作用的东西?

有人知道为什么吗?

Angular Material - Input Docs

<form class="example-form">

  <md-input-container class="example-full-width" style="width: 300px; padding: 5px; border-radius: 10px;">
    <input mdInput type="email" name="to" placeholder="Email">
    <md-error></md-error>
  </md-input-container>

  <md-input-container focus focused>
    <input mdInput type="text" name="a" placeholder="zzzz" focus focused (focus)="">
  </md-input-container>

</form>

【问题讨论】:

  • 你能更好地描述这个问题吗?不能编译代码吗?运行时崩溃?它的行为是否与预期不同?错误信息是什么?预期的行为是什么?什么是有效的行为?
  • 看来你得用focused="true"

标签: angular angular-material2 angular-forms


【解决方案1】:

在输入标签类型cdkFocusInitial

<input matInput [(ngModule)]="cityName" cdkFocusInitial>

如果你想了解更多信息click here

【讨论】:

    【解决方案2】:

    您通常可以使用模板标记在没有任何 Typescript 代码的情况下设置焦点。但在对话框的情况下,您需要将@Mackelito 的解决方案与@ViewChildngAfterViewInit() 一起使用。

    当菜单出现时,我必须将焦点放在菜单内的 TextArea 上。幸运的是,Menu 有一个我可以绑定的 (menuOpened) 事件。

      <button mat-stroked-button color="accent" [matMenuTriggerFor]="addMenu"
        (menuOpened)="newTypes.focus()">
        Add
        <mat-icon class="dyna-dropdown-arrow">arrow_drop_down</mat-icon>
      </button>
      <mat-menu #addMenu="matMenu" [overlapTrigger]="false">
        <form [formGroup]="formGroup" (ngSubmit)="onFormSubmit()" novalidate (keydown.tab)="$event.stopPropagation()">
          <mat-form-field appearance="outline" (click)="$event.stopPropagation(); false;">
            <mat-label>New Pay Types</mat-label>
            <textarea #newTypes rows="6" matInput placeholder="New Pay Types" [formControl]="formGroup.controls['payTypes']" required></textarea>
            <mat-hint>Enter multiple Pay Types, separated by newlines</mat-hint>
            <mat-error *ngIf="formGroup.controls['payTypes'].invalid">Required</mat-error>
          </mat-form-field>
          <div fxLayout="row-reverse" fxLayoutGap="8px" fxLayoutAlign="start center">
            <button mat-stroked-button color="accent" type="submit" [disabled]="!formGroup.valid">Add</button>
            <button mat-button type="button">
              Cancel
            </button>
          </div>
        </form>
      </mat-menu>
    

    这里的重要部分是(menuOpened)="newTypes.focus()",我们看到newTypes 是一个TemplateRef 变量,附加到我要关注的TextArea,标记为&lt;textarea #newTypes

    这是一个显示我的菜单打开的屏幕截图,它立即将焦点转移到其中的 Textarea。

    【讨论】:

      【解决方案3】:

      您是否尝试过cdkFocusInitial,它将指定将在初始化时获得焦点的元素

      文档可以在here找到

      【讨论】:

        【解决方案4】:

        在设置输入获取焦点之前尝试添加一些延迟。我已将此行为作为指令供您参考。

        delay-focus.ts

        import { Directive, Input, ElementRef } from '@angular/core';
        
        @Directive({
          selector: '[delayFocus]'
        })
        export class DelayFocusDirective {
        
          @Input() delayFocusInterval;
          @Input() set delayFocus(condition: boolean) {
            if (condition) {
              console.log(this.delayFocusInterval);
              setTimeout(() => {
                this.el.nativeElement.focus();
              }, this.delayFocusInterval | 500);
            }
          }
          constructor(private el: ElementRef) { }
        }
        

        例子

        <input type="text" placeholder="Delay 100ms to get focus" delayFocus="true" delayFocusInterval="100">
        

        你可以试试here

        【讨论】:

          【解决方案5】:

          我在同样的问题上苦苦挣扎。我正在使用 F6 打开对话框,但无法通过 &lt;input&gt; 获得焦点。事实证明,我并没有阻止 F6 和 F6 突出显示浏览器 URL 窗口的默认行为;所以它正在窃取焦点。

          switch (event.keyCode) {
                case 117:
                  event.preventDefault();
                  this.openAddAveragesDialog();
                  break;
                default:
                  return;
              }
          

          此外,没有魔法标签属性有效。自动对焦,对焦,对焦,随便什么,没有骰子。我必须创建一个指令并在我的输入元素中使用它。我使用this 答案获得了帮助。

          这是添加指令后的元素(numberOnly 是另一个仅用于数字输入的指令):

          <md-input-container> <input mdInput [focus]="true" [numberOnly]="true"/></md-input-container>
          

          **编辑:为清楚起见,按照@Mackelito 的建议添加指令代码。 这是我使用上面链接的答案编写的指令。请记住,材料已将其标签标签从 &lt;input md-input&gt; 更改为 &lt;input matInput&gt;

          import {Directive, ElementRef, Inject, Input, OnChanges, OnInit,     Renderer} from '@angular/core';
          
          @Directive({
            selector: '[focus]'
          })
          
          export class FocusDirective implements OnChanges, OnInit {
          @Input()
          focus: boolean;
          
          constructor(@Inject(ElementRef) private element: ElementRef, public renderer: Renderer) {}
          
          ngOnInit() {
              this.renderer.invokeElementMethod(this.element.nativeElement,   'focus', []);
          }
          
          public ngOnChanges() {
          this.element.nativeElement.focus();
          }
          
          } 
          

          【讨论】:

          • 这是错误的.. MatInput 指令没有 Input() for "focus".. [focus]="true" 不会做任何事情.. focus 是在控制器中使用的一种方法"this.myInput.focus()"
          • @Mackelito 元素中列出的 [focus] 是我编写的指令。我并没有暗示这是一个开箱即用的材料输入指令。
          • @Mackelito 在我回复后,您已将反对票留在原地。我不清楚为什么。如果不清楚,您能否提供一种改进答案的方法或删除否决票?
          • @Holdglem ops!.. 刚和我生病的儿子在家... 会投票赞成.. 尽管您可能想删除“误导性”指令.. 他们并没有真正带来任何东西到桌子上;)
          • (顺便说一句:如果我能够投票,你需要更新你的答案;)
          【解决方案6】:
          <form class="example-form">
            <md-input-container class="example-full-width" style="width: 300px; padding: 5px; border-radius: 10px;">
              <input mdInput #emailInput="matInput" type="email" name="to" placeholder="Email">
              <md-error></md-error>
            </md-input-container>
          </form>
          

          然后在控制器中:

          @ViewChild('emailInput') searchInput: MatInput;
          ....
          ngAfterViewInit() {
            this.emailInput.focus();
          }
          

          this.emailInput.focus() 所做的实际上是“elementRef.nativeElement.focus()” https://github.com/angular/material2/blob/master/src/lib/input/input.ts#L287

          这样你就可以自己做:

          this.emailInput.nativeElement.focus()
          

          【讨论】:

            【解决方案7】:

            您的尝试没有成功,因为:

            • focused 是在mdInputContainer 上驱动以垫子为重点的类的属性。您可以使用它来了解您的输入是否集中。您不能使用它来更改焦点状态。
            • focusmdInput 上的一种方法,可让您以编程方式聚焦输入。例如,您可以调用 myInput.focus()myInput 类似 ViewChild('myInput')

            但是实现你想要的最简单的方法是使用标准的autofocus 属性:

            <md-input-container>
                <input mdInput type="text" name="a" placeholder="zzzz" autofocus>
            </md-input-container>
            

            【讨论】:

            • 请记住,autofocus 仅在页面首次加载时有效。对于我们的应用程序,当用户添加新的“项目”时,我们正在编译和注入一个窗口。 autofocus 似乎只在用户第一次尝试添加项目时起作用,但此后什么也不做。请记住一点。
            • 我注意到有时其他元素会在页面加载后“窃取”焦点。例如,我的 似乎不管在另一个元素上自动对焦如何都会获得焦点。
            猜你喜欢
            • 2019-03-24
            • 1970-01-01
            • 2020-12-02
            • 2021-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-13
            相关资源
            最近更新 更多