HTML5-Ereignisbehandlung (Onfocus und Onfocusout) mit Winkel 2

117

Ich habe ein Datumsfeld und möchte den Platzhalter standardmäßig entfernen.

Ich verwende Javascript onfocusund onfocusoutEreignisse zum Entfernen von Platzhaltern.

Kann jemand bei der Verwendung der Angular2-Direktive helfen?

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

Ich versuche auf diese Weise zu lösen, aber ich habe Probleme beim Zurücksetzen des Eingabefeldtyps.

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
quelle

Antworten:

235

Versuchen Sie, (focus)und (focusout)anstelle von onfocusund zu verwendenonfocusout

so was : -

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

auch können Sie wie folgt verwenden: -

Einige Leute bevorzugen die On-Präfix-Alternative, die als kanonische Form bekannt ist:

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

Weitere Informationen zur Ereignisbindung finden Sie hier .

Sie müssen HostListner für Ihren Anwendungsfall verwenden

Angular ruft die dekorierte Methode auf, wenn das Host-Element das angegebene Ereignis ausgibt. @HostListenerist ein Dekorator für die Callback / Event-Handler-Methode

Siehe meinen Update funktionierenden Plunker.

Arbeitsbeispiel Working Plunker

Aktualisieren

Einige andere Ereignisse können im Winkel verwendet werden -

(focus)="myMethod()"
(blur)="myMethod()" 
(submit)="myMethod()"  
(scroll)="myMethod()"
Pardeep Jain
quelle
Wo haben Sie Ihre Direktive mit dem Namen verwendet dateinput?
Pardeep Jain
@vishnu siehe meine aktualisierte plnuker
Pardeep Jain
2
Wenn Sie die Standard-HTML-Implementierung verwenden, wird beim Aufrufen der angegebenen Funktion möglicherweise der globale Bereich verwendet. Beispiel: onfocusout="someMethod()" someMethod()In diesem Fall wird im globalen Bereich aufgerufen. Dies ist ein weiterer Grund, warum die Verwendung von Angular in diesem Fall wertvoll ist.
kbpontius
1
@ user5365075 Ich habe kein solches Update gesehen, siehe hier ng6 Demo mit focus stackblitz.com/edit/…
Pardeep Jain
2
Mein Fehler focuswird auf unterstützten Eingaben und Textbereichen funktionieren, aber wenn Sie benutzerdefinierte Komponenten haben, die dies nicht unterstützen, können Sie focusinstattdessen verwenden :)
user5365075
7

Wenn Sie das Fokusereignis bei jeder Eingabe in Ihrer Komponente dynamisch erfassen möchten:

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

Den vollständigen Code finden Sie hier: https://stackblitz.com/edit/angular-93jdir

abahet
quelle
2

Ich habe eine kleine Direktive erstellt, die mit dem Attribut tabindex verknüpft ist. Die Has-Focus-Klasse wird dynamisch hinzugefügt / entfernt.

@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
quelle
0

Die Lösung lautet:

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

arbeitet für mich von Pardeep Jain

Hoàng Huỳnh Nhật
quelle