angular2 ручное срабатывание события клика на конкретном элементе
Я пытаюсь запустить событие click (или любое другое событие) на элементе программно, другими словами, я хочу узнать о подобных функциях, предлагаемых методом jQuery .trigger() в angular2.
Есть ли встроенный метод для этого? ..... если нет, пожалуйста, предложите, как я могу это сделать
Рассмотрим следующий фрагмент кода
<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>
Здесь, когда пользователь щелкает btnAdd, он должен запускать событие click для imgFile
5 ответов
Angular4
Вместо
this.renderer.invokeElementMethod(
this.fileInput.nativeElement, 'dispatchEvent', [event]);
использование
this.fileInput.nativeElement.dispatchEvent(event);
так как invokeElementMethod
больше не будет частью рендера.
Angular2
Используйте ViewChild с переменной шаблона, чтобы получить ссылку на ввод файла, затем используйте Renderer, чтобы вызвать dispatchEvent
провести событие:
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://stackru.com/a/32010791/217408
let event = new MouseEvent('click', {bubbles: true});
this.renderer.invokeElementMethod(
this.fileInput.nativeElement, 'dispatchEvent', [event]);
}
}
Обновить
Так как команда Angular больше не препятствует прямому доступу к DOM, этот более простой код также может быть использован
this.fileInput.nativeElement.click()
Смотрите также https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
Я также хотел подобную функциональность, где у меня есть элемент управления вводом файлов с display:none
и элемент управления Button, где я хотел вызвать событие щелчка File Input Control при нажатии на кнопку, ниже приведен код для этого
<input type="button" (click)="fileInput.click()" class="btn btn-primary" value="Add From File">
<input type="file" style="display:none;" #fileInput/>
так просто, и работает без нареканий...
Это сработало для меня:
<button #loginButton ...
и внутри контроллера:
@ViewChild('loginButton') loginButton;
...
this.loginButton.getNativeElement().click();
Чтобы получить родную ссылку на что-то вроде
ion-input
, попробуй использовать это
@ViewChild('fileInput', { read: ElementRef }) fileInput: ElementRef;
а потом
this.fileInput.nativeElement.querySelector('input').click()
Ответ Гюнтера Цохбауэра правильный. Просто подумайте о добавлении следующей строки:
showImageBrowseDlg() {
// from http://stackru.com/a/32010791/217408
let event = new MouseEvent('click', {bubbles: true});
event.stopPropagation();
this.renderer.invokeElementMethod(
this.fileInput.nativeElement, 'dispatchEvent', [event]);
}
В моем случае я бы получил ошибку "перехватил RangeError: Превышен максимальный размер стека вызовов", если нет. (У меня есть карта Div, стреляющая по клику и входному файлу внутри)
Если вы хотите имитировать, нажмите на элемент DOM следующим образом:
<a (click)="showLogin($event)">login</a>
и есть что-то вроде этого на странице:
<li ngbDropdown>
<a ngbDropdownToggle id="login-menu">
...
</a>
</li>
ваша функция в component.ts
должно быть так:
showLogin(event) {
event.stopPropagation();
document.getElementById('login-menu').click();
}