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);
      }
  }
Vishnu
la source

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()"
Pardeep Jain
la source
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

abahet
la source
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");
    }
}
S.Galarneau
la source
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();
}
Seba Arce
la source
0
<input name="date" type="text" (focus)="focusFunction()" (focusout)="focusOutFunction()">

travaille pour moi de Pardeep Jain

Hoàng Huỳnh Nhật
la source