你必须告诉你在哪里可以找到你的 jQuery typeScript 定义。这可以在一个 typings.d.ts 文件中完成,您可以在其中放置您的类型,如下所示:
///<reference path="../typings/jquery/jquery.d.ts" />
或者您可以通过节点安装类型并让您的配置自动加载它。这就是 angular-cli 所做的。
之后,要在 Angular2 中使用 jQuery,您必须了解基本机制。 Angular2 有它自己的 dom 表示,而 jQuery 操纵这个 dom。这就是为什么人们说“不要在 Angular2 中使用 jQuery”。这是不对的。 Angular2 为这个问题提供了解决方案。它称之为ControlValueAccessor。这样做的目的是在你的 jQuery 插件修改 DOM 时提醒 Angular,并在它修改 DOM 时让 Angular 通知你的插件。
让我通过一个日期选择器日历的例子来解释这一点。
import { Directive, ElementRef, OnInit, AfterViewInit, Input, forwardRef, OnDestroy } from '@angular/core';
import { Moment } from 'moment';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
const DATE_PICKER_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => FnCalendarDirective),
multi: true,
};
@Directive({
selector: '[fn-calendar]',
providers: [DATE_PICKER_VALUE_ACCESSOR],
})
export class FnCalendarDirective implements OnInit, AfterViewInit, ControlValueAccessor, OnDestroy {
@Input() format: string = 'DD/MM/YYYY HH:mm';
@Input() showClose: boolean = true;
@Input() sideBySide: boolean = false;
@Input() ngModel;
private onTouched = () => { };
private onChange: (value: string) => void = () => { };
constructor(private el: ElementRef) {
}
ngOnInit() {
}
ngAfterViewInit() {
$(this.el.nativeElement).datetimepicker({
locale: 'fr',
sideBySide: this.sideBySide,
format: this.format,
showClose: this.showClose,
icons: {
time: 'fa fa-clock-o',
date: 'fa fa-calendar',
up: 'fa fa-chevron-up',
down: 'fa fa-chevron-down',
previous: 'fa fa-chevron-left',
next: 'fa fa-chevron-right',
today: 'fa fa-bullseye',
clear: 'fa fa-trash',
close: 'fa fa-times'
},
}).on('dp.change', event => {
let date: Moment = (<Moment>(<any>event).date);
if (date) {
let value = date.format(this.format);
this.onChange(value);
}
});
this.writeValue(this.ngModel);
}
writeValue(date: string) {
$(this.el.nativeElement).datetimepicker().data('DateTimePicker').date(date);
}
registerOnChange(fn: any) {
this.onChange = fn;
}
registerOnTouched(fn: any) {
this.onTouched = fn;
}
ngOnDestroy() {
$(this.el.nativeElement).datetimepicker().data('DateTimePicker').destroy();
}
}
这里重要的是 writeValue 方法,它让 Angular2 通知您的 jquery 插件正在产生更改。还有 registerOnChange,它可以让你通知 Angular2 你的插件对 DOM 进行了更改。
总之,使用 jQuery 的关键在于将 jQuery 插件封装在指令中,并实现一个 CustomValueAccesor 来处理插件和 Angular2 之间的通信。
要查找类型,您可以使用DefinitlyTyped GitHub,这是一个来自许多 js 库的类型定义的存储库。
[1]: http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html