import {Component, ElementRef, OnInit} from 'angular2/core'; declare var jQuery:any; @Component({ selector: 'jquery-integration', templateUrl: './components/jquery-integration/jquery-integration.html' }) export class JqueryIntegration implements OnInit { elementRef: ElementRef; constructor(elementRef: ElementRef) { this.elementRef = elementRef; } ngOnInit() { jQuery(this.elementRef.nativeElement).draggable({ containment:'#draggable-parent' }); } }
JQuery peut-il être utilisé avec TypeScript dans Angular2 comme ci-dessus? Comment utiliser jQuery avec JavaScript dans Angular2?
À mon avis: si vous le faites bien et si vous le gardez au minimum, vous devriez aller avec cela.
Exemple:
@Directive({ selector: "[sm-dropdown]" }) export class SMDropdown { constructor(el: ElementRef) { jQuery(el.nativeElement).dropdown(); } }
Considérez ce plunker:
https://plnkr.co/edit/MMNWGh?p=preview
Ne pas:
Une fois que vous avez installé la bibliothèque typescript de JQuery, faites-la référence de cette manière.
///
Alors faites les importations nécessaires
import {Component, AfterViewInit} from 'angular2/core';
Maintenant, écris la classe
@Component({ selector: 'my-app', templateUrl: 'app/html/app.component.html' }) export class AppComponent implements AfterViewInit { ngAfterViewInit() { // Your jQuery code goes here $('#here').text("HALLO! ^_^"); } }
Ce que je fais pour résoudre ce problème:
Pour la bibliothèque ne supporte pas @types/
et la bibliothèque doit être chargée lors du chargement du document (les bibliothèques moyennes doivent être ajoutées à la balise script du document)
npm install jquery --save
Ajoutez des fichiers js / css dans les scripts
ou les styles
de angular-cli.json
comme
"scripts": ["../node_modules/path to file", "./assets/path to file"]
Pour les bibliothèques sockets en charge @types/
, exécutez simplement npm install @types/jquery --save-dev
Pour utiliser la bibliothèque, ajoutez declare var jQuery: any;
avant l’annotation @Directive
ou @Component
voulez utiliser la lib
P / S: J’utilise angular-cli
avec webpack
dans mon projet, peut-être différent avec systemjs
Vous devez indiquer où trouver votre définition de typeScript jQuery. Cela peut être fait dans un fichier typings.d.ts où vous mettez vos dactylographies comme ceci:
///
Vous pouvez également installer des saisies via nœud et laisser votre configuration le charger automatiquement. C’est ce que font angular-cli.
Après cela, pour utiliser jQuery avec Angular2, vous devez comprendre un mécanisme fondamental. Angular2 a sa propre représentation dom et jQuery manipule ce dom. C’est pourquoi les gens disent “N’utilisez pas jQuery avec Angular2”. Ce n’est pas vrai. Angular2 propose une solution à ce problème. Il l’appelle ControlValueAccessor . Le but de cette opération est d’alerter angular lorsque votre plugin jQuery modifie le DOM et également de permettre à angular d’avertir votre plugin de la modification du DOM.
Laissez-moi vous expliquer ceci à travers un exemple de calendrier de sélecteur de date.
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: ssortingng = 'DD/MM/YYYY HH:mm'; @Input() showClose: boolean = true; @Input() sideBySide: boolean = false; @Input() ngModel; private onTouched = () => { }; private onChange: (value: ssortingng) => 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 = ((event).date); if (date) { let value = date.format(this.format); this.onChange(value); } }); this.writeValue(this.ngModel); } writeValue(date: ssortingng) { $(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(); } }
Les choses importantes ici sont la méthode writeValue qui permet à Angular2 d’avertir votre plugin jquery qu’une modification est en cours de production. Et registerOnChange, qui vous permet d’avertir Angular2 que votre plugin apporte une modification au DOM.
En conclusion, la clé pour utiliser jQuery consiste à envelopper la directive interne du plugin jQuery et à implémenter un CustomValueAccesor pour gérer la communication entre votre plugin et Angular2.
Pour trouver des typages, vous pouvez utiliser DefinitlyTyped GitHub, qui est un référentiel de définitions de typages provenant de la bibliothèque js.
[1]: http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html
. $ ('document'). ready ((fonction ($) { fonction de retour () { // DOM est prêt et $ est une référence à jQuery // Il est temps de faire les choses en utilisant $ }; }) (jQuery));
Avantages :
Toutefois, si vous devez utiliser jQuery dans les composants, utilisez des services ou des directives.
Si vous rencontrez des problèmes lors du chargement d'une vue partielle, utilisez le gestionnaire d'événements jQuery sur le noeud de document et le gestionnaire de chargement de fenêtre jQuery.
nous pouvons utiliser comme suit:
var jq=require('./jquery.min.js'); ..... export class AppComponent{ ngOnInit(){ jq(); console.log($('body')) // show:[body, prevObject: r.fn.init[1]] //ok!normal operation! } }