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


118

J'ai un champ de date et je souhaite supprimer l'espace réservé par défaut.

J'utilise javascript onfocuset des onfocusoutévénements pour supprimer l'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 manière, mais je rencontre un problème avec la réinitialisation du type de champ de saisie.

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

Réponses:


235

Essayez d'utiliser (focus)et (focusout)au lieu de onfocusetonfocusout

comme ça : -

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

vous pouvez également utiliser comme ceci: -

certaines personnes préfèrent l'alternative on-prefix, 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énements, cliquez ici .

vous devez utiliser HostListner pour votre cas d'utilisation

Angular appellera la méthode décorée lorsque l'élément hôte émettra l'événement spécifié. @HostListenerest un décorateur pour la méthode callback / event handler

Voir ma mise à jour de Plunker.

Exemple de travail Working Plunker

Mettre à jour

Certains autres événements peuvent être utilisés en angulaire -

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

où vous avez utilisé votre directive nommée dateinput?
Pardeep Jain

@vishnu voir mon plnuker mis à jour
Pardeep Jain

2
Quelque chose à noter, si vous utilisez l'implémentation HTML par défaut, elle peut utiliser la portée globale lors de l'appel de la fonction désignée. Par exemple:, onfocusout="someMethod()" someMethod()dans ce cas, sera appelé dans la portée globale. C'est une autre raison pour laquelle l'utilisation d'Angular dans ce cas est précieuse.
kbpontius

1
@ user5365075 Je n'ai vu aucune mise à jour de ce type, voir ici la démo focus ng6 en
...

2
Mon erreur focusfonctionnera sur les entrées et les zones de texte prises en charge, mais si vous avez des composants personnalisés qui ne le prennent pas en charge, vous pouvez les utiliser à la focusinplace :)
user5365075

7

Si vous souhaitez capturer l'événement de 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');
            });
        });
    }
}

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


2

J'ai créé une petite directive qui se lie avec 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");
    }
}

0

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
<input name="date" type="text" (focus)="focusFunction()" (focusout)="focusOutFunction()">

travaille pour moi de Pardeep Jain

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.