86 votes

Comment utiliser le plugin jQuery avec Angular 4 ?

Je veux utiliser un curseur de gamme dans un projet angulaire et j'ai essayé d'utiliser un module disponible pour angular 4.

Il fonctionne bien pendant la compilation mais lorsque j'essaie de le construire pour le déploiement, l'erreur suivante se produit.

enter image description here

J'ai vérifié l'option permettant d'utiliser le plugin jQuery directement dans le projet angulaire et je n'obtiens que des options pour le faire dans Angular 2.

Est-il possible d'utiliser les plugins jQuery dans Angular 4 ?

Faites-moi savoir.

Merci d'avance !

1 votes

Enveloppez-le dans un composant : hackernoon.com/ Il n'y a pas de différence entre ng2 et ng4 de ce point de vue.

189voto

Ervin Llojku Points 2833

Installer jquery avec npm

npm install jquery --save

Ajouter des typages

npm install --save-dev @types/jquery

Ajouter scripts à angular-cli.json

"apps": [{
  ...
  "scripts": [
    "../node_modules/jquery/dist/jquery.min.js",
  ],
  ...
}]

Construire le projet et servir

ng build

J'espère que cela vous aidera ! Bon codage

12 votes

N'oubliez pas non plus de add declare var jquery:any; declare var $ :any; à votre fichier .ts.

19 votes

@Norx les instructions incluent l'installation des types ce qui signifie que vos lignes ne sont pas nécessaires.

5 votes

J'obtiens des erreurs de construction quand je fais ça. J'ai installé jquery 3.2.1 avec les types, ce qui fait que je n'obtiens pas d'erreurs dans le code, mais j'obtiens toujours des erreurs de compilation : Cannot find name '$'

162voto

GAURAV ROY Points 1581

Oui vous pouvez utiliser jquery avec Angular 4

Des pas :

1) En index.html mettre en dessous de la ligne dans le tag.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

2) Dans le fichier composant ts ci-dessous vous devez déclarer var comme ceci

import { Component } from '@angular/core';
declare var jquery:any;
declare var $ :any;

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'angular 4 with jquery';
  toggleTitle(){
    $('.title').slideToggle(); //
  }

}

Et utiliser ce code pour le fichier html correspondant comme ceci :

<h1 class="title" style="display:none">
  {{title}}
</h1>
<button (click)="toggleTitle()"> clickhere</button>

Cela fonctionnera pour vous. Merci

1 votes

Ça a marché ! Comment utiliseriez-vous des plugins étendus comme jquery-ui ?

1 votes

Résolu : npm install jquery && typings install dt~jquery --global --save

0 votes

@Johannes Reportez-vous à la documentation sur les caractères pour les typages. typescriptlang.org/docs/handbook/declaration-files/ , microsoft.github.io/TypeSearch

35voto

Installer jQuery à l'aide de NPM Jquery NPM

npm install jquery

Installez le fichier de déclaration jQuery

npm install -D @types/jquery

Importer jQuery dans .ts

import * as $ from 'jquery';

appel dans la classe

export class JqueryComponent implements OnInit {

constructor() {
}

ngOnInit() {
    $(window).click(function () {
        alert('ok');
        });
    }

}

27voto

Soori Points 271

Vous n'êtes pas obligé de déclarer une variable jQuery lorsque vous avez installé @types/jquery.

declare var jquery:any;   // not required
declare var $ :any;   // not required

Vous devriez avoir accès à jQuery partout.

Ce qui suit devrait fonctionner :

jQuery('.title').slideToggle();

1 votes

Je reçois cette erreur Cannot find name 'jQuery' si je ne les déclare pas dans les .ts fichier. Ainsi, si quelqu'un est confronté à ce problème, il lui suffit de le déclarer.

0 votes

J'ai eu des problèmes dans le passé où les déclarations d'importation mentionnées étaient nécessaires pour que le compilateur TS ne se plaigne pas. Cependant, j'ai récemment mis à jour mes paquets et maintenant ces déclarations d'importation font que mes plugins tiers ne sont pas définis. Voici ma configuration actuelle : Version d'Angular : 4.4.7 @angular/cli@1.7.4 jquery@3.3.1 typescript@2.3.4

13voto

Phil Points 1940

Vous ne devez pas utiliser jQuery dans Angular. Bien que cela soit possible (voir les autres réponses à cette question), il est déconseillé de le faire. Pourquoi ?

Angular conserve une représentation propre du DOM dans sa mémoire et n'utilise pas de sélecteurs de requêtes (des fonctions telles que document.getElementById(id) ) comme jQuery. Au lieu de cela, toute la manipulation du DOM est effectuée par Renderer2 (et les directives Angular comme *ngFor et *ngIf accèdent à ce Renderer2 en arrière-plan/code du cadre). Si vous manipulez vous-même le DOM avec jQuery, vous finirez tôt ou tard...

  1. Vous rencontrez des problèmes de synchronisation et des éléments qui apparaissent ou disparaissent au mauvais moment sur votre écran.
  2. Avoir des problèmes de performance dans les composants plus complexes, car la représentation interne du DOM d'Angular est liée à zone.js et à son mécanisme de détection des changements. Ainsi, la mise à jour manuelle du DOM bloquera toujours le thread sur lequel votre application est exécutée.
  3. Avoir d'autres erreurs déroutantes dont vous ne connaissez pas l'origine.
  4. Impossibilité de tester correctement l'application (Jasmine exige que vous sachiez quand les éléments ont été rendus).
  5. Impossibilité d'utiliser Angular Universal ou WebWorkers

Si vous voulez vraiment inclure jQuery (pour mettre en place un prototype que vous jetterez définitivement à 100%), je recommande de l'inclure au moins dans votre package.json avec npm install --save jquery au lieu de l'obtenir à partir du CDN de Google.

TLDR : Pour apprendre à manipuler le DOM à la manière d'Angular, veuillez d'abord suivre le tutoriel officiel sur le tour des héros : https://angular.io/tutorial/toh-pt2 Si vous devez accéder à des éléments situés plus haut dans la hiérarchie du DOM (parent ou document body ) ou pour une autre raison, des directives comme *ngIf , *ngFor des directives personnalisées, des tuyaux et d'autres utilitaires angulaires tels que [style.background] , [class.myOwnCustomClass] ne répondent pas à vos besoins, utilisez Renderer2 : https://www.concretepage.com/angular-2/angular-4-renderer2-example

0 votes

Je comprends votre point de vue. Mais comment accéder au DOM et le modifier dans angular. Par exemple $('.js-eachoption[data-id=' + parentId + ']').closest('.eachLevel').after(html) ; Comment faire cela avec seulement angular.

3 votes

Dans Angular, vous ne commencez généralement pas à chercher des éléments dans le DOM à partir de la balise html Root, bien que cela soit également possible (en référençant DOCUMENT ou WINDOW dans n'importe quel composant). La modularisation (pour laquelle Angular est conçu) vous oblige à construire votre application de manière à ne manipuler que les éléments enfants à partir des éléments parents. À long terme, une telle dépendance hiérarchique rend le développement et la maintenance du code beaucoup plus faciles. Vous devez donc essayer de manipuler uniquement l'élément DOM hôte du composant actuel ou tout ViewChild ou ContentChild et leurs enfants.

0 votes

@Pradeep Ainsi, lorsque vous obtenez une référence à un élément ( constructor(private renderer: Renderer2, private el: ElementRef) {} ), vous pouvez soit filtrer ses enfants, soit manipuler directement l'élément en accédant à sa propriété nativeElement-Property : ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); } . Voici un tutoriel pour vous en dire plus : alligator.io/angular/using-renderer2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X