Angular2和jQuery’改变’事件
我有一个隐藏的输入来控制jQuery所做的更改,其中包括一个angular2 change
事件,就像这样
然后在我的情况下,我必须使用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'); }
在这种情况下我该如何解决?
您可以将模板引用变量分配给 ,如
#hiddenInput1
,在组件类中获取其本机元素(通过@ViewChild
),然后使用jQuery本身来监听change
事件。
在这里演示plunker 。
import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; @Component({ selector: 'my-app', template: ` My First Angular 2 App
` }) 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
处理程序。
这是一个演示插件
正如@Cristal Embalagens在评论中提到的,你需要为angular2使用input
事件,因为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 {
一些例子