このように、angular2 change
のイベントを含む、jQueryによって行われた変更を制御する非表示の入力があります。
<input id='input1' hidden (change)='onChange($event)'>
次に、私の場合、私はする必要がある jQueryを使用してこの入力の値を変更し、change
イベントをトリガーします。
$('#input1').val('somevalue').trigger('change');
JQueryを介してトリガーしたこのchange
イベントはjQueryでのみ機能し、Angular2では機能しません。
//This is working
$('#input').change(function(){
console.log('Change made');
})
Angular2コンポーネントでは:
//This is not working
onChange(): void{
console.log('Change made');
}
この状況でどうすれば回避できますか?
テンプレート参照変数を<input>
に割り当て、#hiddenInput1
のように、コンポーネントクラス内で(@ViewChild
を介して)ネイティブ要素の保持を取得し、jQuery自体を使用してchange
イベント。
import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<h1>My First Angular 2 App</h1>
<hr>
<input id='input1' hidden #hiddenInput1>
`
})
export class AppComponent implements AfterViewInit {
@ViewChild('hiddenInput1') hiddenInput1:ElementRef;
ngAfterViewInit() {
$(this.hiddenInput1.nativeElement).on('change', (e) => {
console.log('Change made -- ngAfterViewInit');
this.onChange(e);
});
}
onChange(): void{
console.log('Change made -- onChange');
}
}
Angular2変更イベントは、ネイティブaddEventListener
を介して追加されます。
JQueryの.trigger( 'change')でネイティブイベントをトリガーすることはできません。したがって、 ネイティブイベントを作成する および それをディスパッチする が必要になります。
const customEvent = document.createEvent('Event');
customEvent.initEvent('change', true, true);
$('#input1')[0].dispatchEvent(customEvent);
このように、angular2はonChange
ハンドラーを起動します。
これが demo plunker です
@Cristal Embalagensがコメントで述べたように、input
がこのイベントをサブスクライブしているため、angular2にはDefaultValueAccessor
イベントを使用する必要があります。
@Directive({
selector:
'input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]',
Host: {'(input)': 'onChange($event.target.value)', '(blur)': 'onTouched()'},
providers: [DEFAULT_VALUE_ACCESSOR]
})
export class DefaultValueAccessor implements ControlValueAccessor {