私はプログラム的に要素にクリックイベント(または他のイベント)を起動しようとしています、言い換えれば私はangular2のjQueryの.trigger()メソッドによって提供されるような同様の機能を知りたいです。
これを行うための組み込みの方法はありますか? .....していない場合はどうすれば私はこれを行うことができます示唆してください
次のコードを見てください
<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をクリックすると、クリックイベントが発生するはずですimgFile
Angular 4
の代わりに
this.renderer.invokeElementMethod(
this.fileInput.nativeElement, 'dispatchEvent', [event]);
つかいます
this.fileInput.nativeElement.dispatchEvent(event);
invokeElementMethod
はもうレンダラーの一部にはならないからです。
Angular 2
テンプレート変数で 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://stackoverflow.com/a/32010791/217408
let event = new MouseEvent('click', {bubbles: true});
this.renderer.invokeElementMethod(
this.fileInput.nativeElement, 'dispatchEvent', [event]);
}
}
更新
直接DOMアクセスはAngularチームによって推奨されなくなったため、この単純なコードも使用できます。
this.fileInput.nativeElement.click()
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent もご覧ください。
display:none
を持つFile Input ControlとクリックイベントをトリガーしたいButton 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();
GünterZöchbauerの答えは正しいものです。次の行を追加することを検討してください。
showImageBrowseDlg() {
// from http://stackoverflow.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();
}