web-dev-qa-db-fra.com

Gestion des événements HTML5 (onfocus et onfocusout) à l'aide de angular 2

J'ai un champ de date et je veux supprimer le titulaire par défaut.

J'utilise les événements javascript onfocus et onfocusout pour supprimer un espace réservé.

Quelqu'un peut-il aider à utiliser la directive angular2?

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

J'essaie de résoudre de cette façon, mais je ne parviens pas à réinitialiser le type de champ d'entrée.

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);
      }
  }
93
vishnu

Essayez d’utiliser (focus) et (focusout) au lieu de onfocus et onfocusout.

comme ça : -

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

aussi vous pouvez utiliser comme ceci: -

certaines personnes préfèrent l'alternative sur préfixe, connue sous le nom de forme canonique:

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

En savoir plus sur la liaison d'événement voir ici .

vous devez utiliser HostListner pour votre cas d'utilisation

Angular invoquera la méthode decorated lorsque l'élément Host émettra l'événement spécifié .@HostListener est un décorateur pour la méthode callback/event handler

Voir ma mise à jour de travail Plunker.

Exemple de travail Working Plunker

184
Pardeep Jain

Si vous souhaitez capturer l'événement focus de manière dynamique sur chaque entrée de votre composant:

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');
            });
        });
    }
}

Commander le code complet ici: https://stackblitz.com/edit/angular-93jdir

4
abahet

J'ai créé une petite directive qui se lie à l'attribut tabindex. Il ajoute/supprime dynamiquement la classe 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");
    }
}
1
S.Galarneau

La solution est la suivante:

  <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
Seba Arce