Estoy tratando de activar el evento de clic (o cualquier otro evento) en el elemento programáticamente.En otras palabras, quiero conocer las características similares que ofrece el método jQuery .trigger () en angular2.
¿Existe algún método integrado para hacer esto? ..... si no, por favor sugiera cómo puedo hacer esto
Considere el siguiente fragmento de código
<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>
Aquí, cuando el usuario hace clic en btnAdd , debería disparar el evento de clic en imgFile
angular
angular2-forms
Jorin
fuente
fuente
imgFile.click()
lugar deshowImageBrowseDlg()
si sigue la siguiente respuesta de @ akshay-khale stackoverflow.com/a/41675017/344029 (después de agregar la variable<input #imgFile
)Respuestas:
Angular4
En vez de
this.renderer.invokeElementMethod( this.fileInput.nativeElement, 'dispatchEvent', [event]);
utilizar
this.fileInput.nativeElement.dispatchEvent(event);
porque
invokeElementMethod
ya no será parte del renderizador.Angular2
Use ViewChild con una variable de plantilla para obtener una referencia a la entrada del archivo, luego use el Renderer para invocar
dispatchEvent
y disparar el evento: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]); } }
Actualizar
Dado que el equipo de Angular ya no desaconseja el acceso directo al DOM, este código más simple también se puede usar
this.fileInput.nativeElement.click()
Véase también https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
fuente
this.fileInput.nativeElement.click()
también funciona, parece.nativeElement
y utilizarlosRenderer
en su lugar. Creo que esto cambió bastante recientemente y el acceso directo al DOM está bien ahora, pero no funcionará con la representación del lado del servidor y WebWorkers.@ViewChildren('fileInput') QueryList<ElementRef>;
Ver también stackoverflow.com/questions/32693061/…También quería una funcionalidad similar en el que tengo un control de entrada de archivos con
display:none
y un control Button donde quería gatillo evento click del archivo de entrada de control al hacer clic en el botón, a continuación es el código para hacerlotan simple como eso y funciona a la perfección ...
fuente
<input #name type="text" (keyup.enter)="addBtn.click()"> <button #addBtn (click)="add(name.value)" type="button">Add</button>
Esto funcionó para mí:
y dentro del controlador:
fuente
La respuesta de Günter Zöchbauer es la correcta. Solo considere agregar la siguiente línea:
En mi caso, obtendría un error de "RangeError atrapado: tamaño máximo de pila de llamadas excedido" si no. (Tengo una tarjeta div que se dispara al hacer clic y el archivo de entrada en el interior)
fuente
Si desea imitar, haga clic en el elemento DOM de esta manera:
y tener algo como esto en la página:
tu función
component.ts
debería ser así:fuente
Para obtener la referencia nativa a algo como un
ion-input
, ry usando estoy entonces
fuente