Próbuję programowo wywołać zdarzenie kliknięcia (lub jakiekolwiek inne zdarzenie) na elemencie, innymi słowy, chcę poznać podobne funkcje, jakie oferuje metoda jQuery .trigger () w angular2.
Czy jest jakaś wbudowana metoda, aby to zrobić? ..... jeśli nie, proszę zasugerować, jak mogę to zrobić
Rozważ następujący fragment kodu
<form [ngFormModel]="imgUploadFrm"
(ngSubmit)="onSubmit(imgUploadFrm)">
<br>
<div class="input-field">
<input type="file" id="imgFile" (click)="onChange($event)" >
</div>
<button id="btnAdd" type="submit" (click)="showImageBrowseDlg()" )>Add Picture</button>
</form>
W tym przypadku, gdy użytkownik kliknie btnAdd , powinno uruchomić zdarzenie click na imgFile
angular
angular2-forms
Jorin
źródło
źródło
imgFile.click()
zamiast tegoshowImageBrowseDlg()
postępować zgodnie z poniższą odpowiedzią @ akshay-khale stackoverflow.com/a/41675017/344029 (po dodaniu zmiennej<input #imgFile
)Odpowiedzi:
Angular4
Zamiast
this.renderer.invokeElementMethod( this.fileInput.nativeElement, 'dispatchEvent', [event]);
posługiwać się
this.fileInput.nativeElement.dispatchEvent(event);
ponieważ
invokeElementMethod
nie będzie już częścią renderera.Angular2
Użyj ViewChild ze zmienną szablonu, aby uzyskać odniesienie do wejścia pliku, a następnie użyj modułu renderującego, aby wywołać
dispatchEvent
zdarzenie:import { Component, Renderer, ElementRef, ViewChild } from '@angular/core'; @Component({ ... template: ` ... <input #fileInput type="file" id="imgFile" (click)="onChange($event)" > ...` }) class MyComponent { @ViewChild('fileInput') fileInput:ElementRef; constructor(private renderer:Renderer) {} showImageBrowseDlg() { // from http://stackoverflow.com/a/32010791/217408 let event = new MouseEvent('click', {bubbles: true}); this.renderer.invokeElementMethod( this.fileInput.nativeElement, 'dispatchEvent', [event]); } }
Aktualizacja
Ponieważ zespół Angular nie odradza już bezpośredniego dostępu do DOM, ten prostszy kod może być również używany
this.fileInput.nativeElement.click()
Zobacz także https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
źródło
this.fileInput.nativeElement.click()
wydaje się, że również działa.nativeElement
i używaniaRenderer
. Myślę, że zmieniło się to całkiem niedawno i bezpośredni dostęp do DOM jest teraz w porządku, ale nie będzie działać z renderowaniem po stronie serwera i WebWorkerami.@ViewChildren('fileInput') QueryList<ElementRef>;
Zobacz także stackoverflow.com/questions/32693061/…Chciałem też podobną funkcjonalność, gdzie mam kontrolę plik wejściowy z
display:none
i kontroli Przycisk gdzie chciałem wyzwalacza kliknij zdarzenie wejścia pliku kontrolnym po kliknięciu na przycisk poniżej jest kod, aby to zrobićtakie proste i działa bez zarzutu ...
źródło
<input #name type="text" (keyup.enter)="addBtn.click()"> <button #addBtn (click)="add(name.value)" type="button">Add</button>
To zadziałało dla mnie:
i wewnątrz kontrolera:
źródło
Odpowiedź Güntera Zöchbauera jest właściwa. Wystarczy rozważyć dodanie następującego wiersza:
W moim przypadku dostałbym błąd „złapany RangeError: maksymalny rozmiar stosu wywołań przekroczony”, jeśli nie. (Mam kartę div uruchamianą po kliknięciu i plik wejściowy w środku)
źródło
Jeśli chcesz imitować, kliknij element DOM w ten sposób:
i mam na stronie coś takiego:
Twoja funkcja w
component.ts
powinna wyglądać następująco:źródło
Aby uzyskać natywne odniesienie do czegoś takiego
ion-input
, jak , używając tegoi wtedy
źródło