Angular 2 从 Jquery 调用 Typescript 函数会导致未捕获的 TypeError

Posted

技术标签:

【中文标题】Angular 2 从 Jquery 调用 Typescript 函数会导致未捕获的 TypeError【英文标题】:Angular 2 calling a Typescript function from Jquery causes uncaught TypeError 【发布时间】:2016-09-04 14:19:31 【问题描述】:

我有一个带有输入文本字段的组件,我使用 JQuery 附加了一个输入事件侦听器。当输入的值发生变化时,我想调用一个 Typescript 函数,但它会抛出一个未捕获的 TypeError。

这是我的代码:

import Component, Input, Output, EventEmitter, ElementRef, OnInit from 'angular2/core';
declare var jQuery: any;

@Component(
    selector: 'setting-priority',
    template: '<input [(ngModel)]="priority" class="setting-priority" type="text">'
)

export class SettingPriorityComponent implements OnInit
    @Input() priority: number;
    @Output() prioChanged: EventEmitter<number> = new EventEmitter();

    constructor(private elementRef:ElementRef)  

    ngOnInit() 
        jQuery(this.elementRef.nativeElement).find('input').on('input', function() 
            // Here I will pass the changed value to onChange function
            this.onChange();
        );
    

    ngOnChanges(changes)  
        this.prioChanged.emit(this.priority);
    

    // In this function I will receive the value and assign it to the priority variable
    onChange() 
        console.log("onchange!");
    

我正在使用 Jquery,因为输入值将以编程方式设置 - 在这种情况下,Angular 的更改检测不起作用Details here

当我触发输入事件时,我收到 Uncaught TypeError: this.onChange is not a function

我做错了什么?

【问题讨论】:

【参考方案1】:

我会使用箭头函数。这样你就可以使用词法 this(对应于组件实例):

jQuery(this.elementRef.nativeElement).find('input').on('input', () => 
  this.onChange();
);

查看此链接了解更多详情: https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Functions/Arrow_functions

【讨论】:

效果很好!谢谢!顺便说一句,我找到了另一种方法 - 将 JavaScript 变量绑定到角度上下文,然后使用它调用函数:var self = this;jQuery(this.elementRef.nativeElement).find('input').on('input', function self.onChange(); );【参考方案2】:

尽量避免在Angular2中使用jQuery。

获取对元素的引用的更棱角分明的方法是

@Component(
    selector: 'setting-priority',
    template: '<input #prio [(ngModel)]="priority" class="setting-priority" type="text">'
)
export class SettingPriorityComponent implements OnInit
  @ViewChild('prio') priority;

  ngOnInit() 
    console.log(this.priority);
  

但要添加事件处理程序,您只需要:

template: '<input [(ngModel)]="priority" (input)="onChange()" class="setting-priority" type="text">'

【讨论】:

谢谢!我正在使用 Jquery-UI 使用拖放操作使表格可排序,因为我没有为原生 Angular 2 找到如此简单的解决方案。

以上是关于Angular 2 从 Jquery 调用 Typescript 函数会导致未捕获的 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

从纯 Javascript/JQuery 调用 Angular js 函数

可重用的 jQuery 函数 - Angular

Angular Universal Render 等待 Http 结果 Observable 订阅者

ajax调用后,jquery mobile在复选框上没有样式

Angular 5 和 jQuery:(点击)不调用函数

Angular VS jQuery