Sie müssen angeben, wo Sie Ihre jQuery TypeScript-Definition finden können. Dies kann in einem typings.d erfolgen.ts-Datei, wo Sie Ihre Typisierungen so:
///<reference path="../typings/jquery/jquery.d.ts" />
Oder Sie können Typisierungen über den Knoten installieren und lassen Sie Ihre Konfiguration laden sie automatisch. Das ist was eckig-cli tun.
Danach wird die Verwendung von jQuery mit Angular2 Sie einen fondamental Mechanismus verstehen müssen. Angular2 hat seine eigene dom-Repräsentation und jQuery manipuliert diese dom. Deshalb sagen die Leute: "Verwenden Sie jQuery nicht mit Angular2". Das ist nicht richtig. Angular2 kommt mit einer Lösung für dieses Problem. Es nennt es ControlValueAccessor. Das Ziel ist, eckig zu warnen, wenn Ihr jQuery-Plugin das DOM modifiziert und auch Ihr Plugin bei der Änderung des DOM eckig benachrichtigen lässt.
Lassen Sie mich dies durch ein Beispiel für Datumsauswahlkalender erklären.
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();
}
}
Wichtige Dinge hier sind Writevalue Methode, die Angular2 Ihre jQuery-Plugin mitteilen lassen, dass eine Änderung produziert wird. Und registerOnChange, mit dem Sie Angular2 darüber informieren können, dass Ihr Plugin eine Änderung am DOM vornimmt.
Zusammenfassend ist der Schlüssel zur Verwendung von jQuery, Ihr jQuery-Plugin innerhalb der Direktive zu wickeln und einen CustomValueAccesor zu implementieren, um die Kommunikation zwischen Ihrem Plugin und Angular2 zu handhaben.
Um Typisierungen zu finden, können Sie DefinitlyTyped GitHub verwenden, das ein Repository für Typdefinitionen aus der Menge der js-Bibliothek ist.
[1]: http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html
Es ist ratsam, mit kantigem mit jQuery zu vermeiden. http://stackoverflow.com/questions/14994391/thinking-in-angularjs-if-i-have-a-jquery-background?rq=1 – Jay
@Jay, die auf Angular1 entspricht .. ist nicht Angular2 auch jQuery vermeiden ? Hast du einen Hinweis darauf? –
Es könnte helfen http://www.code-sample.com/2016/07/use-jquery-with-angular-2.html –