web-dev-qa-db-ja.com

angular2手動で特定の要素のクリックイベントを発生させる

私はプログラム的に要素にクリックイベント(または他のイベント)を起動しようとしています、言い換えれば私は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

67
Jorin

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 もご覧ください。

156

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/>

それと同じくらい簡単で、それは完璧に働いています...

22
Akshay Khale

これは私のために働いた:

<button #loginButton ...

そしてコントローラーの中:

@ViewChild('loginButton') loginButton;
...
this.loginButton.getNativeElement().click();
3
Marco C.

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カードと入力ファイルを持っています)

1
reneval

このような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();
}
0
Rammgarot