【问题标题】:Angular2 and jQuery 'change' eventsAngular2 和 jQuery 'change' 事件
【发布时间】:2016-11-28 04:06:40
【问题描述】:

我有一个隐藏的输入来控制 jQuery 所做的更改,其中包括一个 angular2 change 的事件,像这样

<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');
}

在这种情况下我该如何解决?

【问题讨论】:

    标签: javascript jquery angular


    【解决方案1】:

    您可以将模板引用变量分配给&lt;input&gt;,例如#hiddenInput1,在组件类中获取其原生元素(通过@ViewChild),然后使用jQuery 本身来监听change事件。

    Demo plunker here.

    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');
      }
    
    }
    

    【讨论】:

    • 我一直在寻找这个解决方案 2 天。非常感谢。
    • 干得好!兄弟,你拯救了我的一天。
    【解决方案2】:

    Angular2 更改事件是通过原生 addEventListener 添加的。

    您不能使用 jQuery 的 .trigger('change') 触发原生事件。所以你需要create a native eventdispatch it

     const customEvent = document.createEvent('Event');  
     customEvent.initEvent('change', true, true);
     $('#input1')[0].dispatchEvent(customEvent);
    

    这样 angular2 将触发 onChange 处理程序。

    这是demo plunker

    正如 cmets 中提到的@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 {
    

    Some Example

    【讨论】:

    • 我会说您的解决方案有效,但@acdcjunior 的回答对我来说似乎是更清洁的解决方案。谢谢。
    • 对于输入字段使用initEvent('input', true, true) 来触发angular2的change事件。
    • 谢谢@CristalEmbalagens。作品!我浪费了 5 个小时,因为我之前没有阅读您的评论 :)
    • @yurzui 完美!您在这里的回答是我解决在 Angular 组件中使 Bootstrap 事件可见/可观察的问题的关键。
    • @CristalEmbalagens 救生员!感谢您提供这么棒的信息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2017-10-07
    • 2011-05-25
    • 2013-11-25
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多