使用angular 2的HTML5事件处理(onfocus和onfocusout)


117

我有一个日期字段,并且我想默认删除占位符。

我正在使用JavaScript onfocusonfocusout事件删除占位符。

有人可以帮助使用angular2指令吗?

<input name="date" type="text" onfocus="(this.type='date')" onfocusout="(this.type='text')" class="dateinput">

我尝试以这种方式解决,但是在重置输入字段类型时遇到问题。

import { Directive, ElementRef, Input } from 'angular2/core';
@Directive({
    selector: '.dateinput', 
    host: {
    '(focus)': 'setInputFocus()',
    '(focusout)': 'setInputFocusOut()',
  }})

  export class MyDirective {
      constructor(el: ElementRef) { this.el = el.nativeElement; console.log(this.el);}

      setInputFocus(): void {
        //console.log(this.elementRef.nativeElement.value);
      }
  }

Answers:


235

尝试使用(focus)and (focusout)代替onfocusandonfocusout

像这样 : -

<input name="date" type="text" (focus)="focusFunction()" (focusout)="focusOutFunction()">

你也可以这样使用:-

有些人更喜欢前缀上的替代形式,即规范形式:

<input name="date" type="text" on-focus="focusFunction()" on-focusout="focusOutFunction()">

有关事件绑定的更多信息,请参见此处

您必须在用例中使用HostListner

当主机元素发出指定事件时,Angular将调用修饰的方法。@HostListener是回调/事件处理程序方法的装饰器

请参阅我的更新正常工作。

工作范例 Working Plunker

更新资料

其他一些事件也可以用于角度-

(focus)="myMethod()"
(blur)="myMethod()" 
(submit)="myMethod()"  
(scroll)="myMethod()"

您在哪里使用了名为的指令dateinput
Pardeep Jain

@vishnu看到我更新的plnuker
Pardeep Jain

2
需要注意的是,如果使用默认的HTML实现,则在调用指定的函数时可能会使用全局作用域。例如:onfocusout="someMethod()" someMethod()在这种情况下,将在全局范围内调用。这就是为什么在这种情况下使用Angular有价值的另一个原因。
kbpontius

1
@ user5365075我没有看到任何此类更新,请参见此处使用focus stackblitz.com/edit/…的
Pardeep Jain

2
我的错误,focus可以在支持的输入和文本区域上工作,但是如果您有不支持它的自定义组件,则可以focusin改用:)
user5365075 18-10-10

7

如果要动态捕获焦点事件在组件的每个输入上:

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements AfterViewInit {

  constructor(private el: ElementRef) {
  }

  ngAfterViewInit() {
       // document.getElementsByTagName('input') : to gell all Docuement imputs
       const inputList = [].slice.call((<HTMLElement>this.el.nativeElement).getElementsByTagName('input'));
        inputList.forEach((input: HTMLElement) => {
            input.addEventListener('focus', () => {
                input.setAttribute('placeholder', 'focused');
            });
            input.addEventListener('blur', () => {
                input.removeAttribute('placeholder');
            });
        });
    }
}

在此处签出完整代码:https : //stackblitz.com/edit/angular-93jdir


2

我创建了一个与tabindex属性绑定的小指令。它动态地添加/删除has-focus类。

@Directive({
    selector: "[tabindex]"
})
export class TabindexDirective {
    constructor(private elementHost: ElementRef) {}

    @HostListener("focus")
    setInputFocus(): void {
        this.elementHost.nativeElement.classList.add("has-focus");
    }

    @HostListener("blur")
    setInputFocusOut(): void {
        this.elementHost.nativeElement.classList.remove("has-focus");
    }
}

0

解决方法是这样的:

  <input (click)="focusOut()" type="text" matInput [formControl]="inputControl"
  [matAutocomplete]="auto">
   <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn" >
     <mat-option (onSelectionChange)="submitValue($event)" *ngFor="let option of 
      options | async" [value]="option">
      {{option.name | translate}}
     </mat-option>
  </mat-autocomplete>

TS
focusOut() {
this.inputControl.disable();
this.inputControl.enable();
}

0
<input name="date" type="text" (focus)="focusFunction()" (focusout)="focusOutFunction()">

从Pardeep Jain为我工作

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.