Come utilizzare jQuery Plugin con Angular 4?


85

Voglio utilizzare un dispositivo di scorrimento della gamma in un progetto angolare e ho provato a utilizzare un modulo disponibile per angolare 4.

Funziona bene durante la compilazione, ma quando provo a crearlo per la distribuzione, genera l'errore seguente.

inserisci qui la descrizione dell'immagine

Ho verificato l'opzione di utilizzare il plug-in jQuery direttamente nel progetto angular e sto solo ottenendo opzioni per farlo in Angular 2.

C'è un modo in cui possiamo usare i plugin jQuery in Angular 4?

Per favore mi faccia sapere.

Grazie in anticipo!


1
Avvolgilo in un componente: hackernoon.com/… Non c'è differenza tra ng2 e ng4 da questa prospettiva.
Razvan Dumitru

Risposte:


160

Sì, puoi usare jquery con Angular 4

Passaggi:

1) In index.htmlmettere sotto la riga nel tag.

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

2) Nel file componente ts sotto devi dichiarare var in questo modo

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(); //
  }

}

E usa questo codice per il file html corrispondente in questo modo:

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

Questo funzionerà per te. Grazie


1
Ha funzionato!! Come useresti plugin estesi come jquery-ui?
Tushar

1
risolto: npm installa jquery e & digitazioni installa dt ~ jquery --global --save
Johannes

@Johannes Fare riferimento ai documenti dattiloscritti per la digitazione typescriptlang.org/docs/handbook/declaration-files/… , microsoft.github.io/TypeSearch
Ervin Llojku

4
@ Jota.Toledo come pensi che dovrebbe essere fatto? Hai ulteriori informazioni sul modo giusto per farlo?
Lucas Medina

3
@ Jota.Toledo vuoi dire aggiungerlo a angular-cli.json? Sembra davvero pratico :) grazie per il consiglio
Lucas Medina

190

Installa jquery con npm

npm install jquery --save

Aggiungi digitazioni

npm install --save-dev @types/jquery

Aggiungi script a angular-cli.json

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

Costruisci progetto e servi

ng build

Spero che sia di aiuto! Divertiti con la codifica


11
Inoltre, non dimenticare di add declare var jquery:any; declare var $ :any;al tuo file .ts.

19
@ Norx le istruzioni includono l'installazione dei tipi, il che significa che le tue linee non sono necessarie.
salbahra

5
Ricevo errori di build quando lo faccio. Ho installato jquery 3.2.1 con i tipi, quindi non mi dà errori nel codice, ma ricevo ancora errori di compilazione che indicano:Cannot find name '$'
Grungondola

1
@Grungondola aggiungi declare const $: any;sopra il @ ... decoratore.
Ervin Llojku

Funziona bene con zone.js di Angular?
Wolf359

34

Installa jQuery utilizzando NPM Jquery NPM

npm install jquery

Installa il file di dichiarazione jQuery

npm install -D @types/jquery

Importa jQuery all'interno di .ts

import * as $ from 'jquery';

chiama in classe

export class JqueryComponent implements OnInit {

constructor() {
}

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

}

27

Non è necessario dichiarare alcuna variabile jQuery durante l'installazione di @ types / jquery.

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

Dovresti avere accesso a jQuery ovunque.

Quanto segue dovrebbe funzionare:

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

1
Ottengo questo errore Cannot find name 'jQuery'se non li dichiaro nel .tsfile. Quindi, se qualcuno affronta questo problema, deve solo dichiararlo.
Amr

In passato ho avuto problemi in cui le istruzioni di importazione menzionate erano necessarie per far sì che il compilatore TS non si lamentasse. Tuttavia, di recente ho aggiornato i miei pacchetti e ora quelle istruzioni di importazione fanno sì che i miei plugin di terze parti non vengano definiti. Ecco la mia configurazione attuale: Versione angolare: 4.4.7 @ angular / cli @ 1.7.4 jquery@3.3.1 typescript@2.3.4
nthaxis

13

Non dovresti usare jQuery in Angular. Sebbene sia possibile (vedi altre risposte per questa domanda), è scoraggiato. Perché?

Angular mantiene una propria rappresentazione del DOM nella sua memoria e non utilizza selettori di query (funzioni come document.getElementById(id)) come jQuery. Invece tutta la manipolazione del DOM viene eseguita da Renderer2 (e direttive Angular come * ngFor e * ngIf che accedono a quel Renderer2 in background / codice del framework). Se manipoli tu stesso DOM con jQuery, prima o poi ...

  1. Si verificano problemi di sincronizzazione e le cose appaiono in modo errato o non scompaiono al momento giusto dallo schermo
  2. Avere problemi di prestazioni in componenti più complessi, poiché la rappresentazione DOM interna di Angular è associata a zone.js e al suo meccanismo di rilevamento delle modifiche, quindi l'aggiornamento manuale del DOM bloccherà sempre il thread su cui è in esecuzione l'app.
  3. Hai altri errori confusi di cui non conosci l'origine.
  4. Non essere in grado di testare correttamente l'applicazione (Jasmine richiede che tu sappia quando gli elementi sono stati renderizzati)
  5. Non essere in grado di utilizzare Angular Universal o WebWorkers

Se vuoi davvero includere jQuery (per il duck tap di qualche prototipo che butterai via definitivamente al 100%), ti consiglio di includerlo almeno nel tuo package.json npm install --save jqueryinvece di ottenerlo dal CDN di Google.

TLDR: Per imparare a manipolare il DOM in modo angolare, segui prima il tutorial ufficiale del tour degli eroi: https://angular.io/tutorial/toh-pt2 Se devi accedere a elementi più in alto nella gerarchia DOM (genitore o document body) o per qualche altra ragione direttive piace *ngIf, *ngFor, direttive personalizzati, tubi e altre utilità come angolari [style.background], [class.myOwnCustomClass] non soddisfano le vostre esigenze, uso Renderer2: https://www.concretepage.com/angular-2/angular-4 -renderer2-esempio


Capisco il tuo punto. Ma come accedere a DOM e cambiarlo in angolare. Ad esempio $ ('. Js-eachoption [data-id =' + parentId + ']'). Più vicino ('. EachLevel'). After (html); Come farlo con solo angolare.
Pradeep

3
@Pradeep in Angular di solito non inizi a cercare elementi all'interno del DOM dal tag html di root, sebbene sia anche possibile (facendo riferimento a DOCUMENT o WINDOW all'interno di qualsiasi componente). La modularizzazione (per cui Angular è fatto) ti costringe a creare la tua app in modo da manipolare solo gli elementi figlio dagli elementi padre. A lungo termine una tale dipendenza gerarchica rende lo sviluppo e la manutenzione del codice molto più facili. Quindi dovresti provare a manipolare solo l'elemento DOM host del componente corrente o qualsiasi ViewChild o ContentChild e i loro figli.
Phil

@Pradeep Quindi, quando si ottiene un riferimento a un elemento ( constructor(private renderer: Renderer2, private el: ElementRef) {}), è possibile filtro per i suoi figli o manipolare l'elemento direttamente accedendo di nativeElement-Proprietà: ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); }. Ecco un tutorial su come dirti di più: alligator.io/angular/using-renderer2
Phil

@Pradeep, tieni presente che renderer2 non è la tua unica opzione. In Angular puoi manipolare il DOM direttamente dal template. Ad esempio, elementi DOM all'interno del modello del componente corrente possono essere facilmente gestiti con *ngIf, *ngFor, personalizzato (fatta da voi) le direttive, tubi e per i CSS ngClass, [style.background]e [class.myCustomCssClass]. Per ulteriore aiuto: angular.io/tutorial/toh-pt2
Phil

8

Prova questo:

import * as $ from 'jquery/dist/jquery.min.js';

Oppure aggiungi script a angular-cli.json:

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

e nel tuo file .ts:

declare var $: any;

1

Puoi aggiornare la tua versione di battitura jquery in questo modo

npm install --save @types/jquery@latest

Ho avuto lo stesso errore e sono stato a se per 5 giorni navigando in rete per una soluzione.it ha funzionato per me e dovrebbe funzionare per te


1

Se hai la necessità di utilizzare altre librerie nei progetti --typescript - non solo nei progetti - angle - puoi cercare tds (TypeScript Declaration File) che sono depares e che contengono informazioni su metodi, tipi, funzioni, ecc., che può essere utilizzato da TypeScript, di solito senza la necessità di importazione. dichiarare var è l'ultima risorsa

npm install @types/lib-name --save-dev

1

Puoi usare webpack per fornirlo . Verrà quindi iniettato DOM automaticamente.

module.exports = {
  context: process.cwd(),
  entry: {
    something: [
      path.join(root, 'src/something.ts')
    ],
    vendor: ['jquery']
  },
  devtool: 'source-map',
  output: {
    path: path.join(root, '/dist/js'),
    sourceMapFilename: "[name].js.map",
    filename: '[name].js'
  },
  module: {
    rules: [
      {test: /\.ts$/, exclude: /node_modules/, loader: 'ts-loader'}
    ]
  },
  resolve: {
    extensions: ['.ts', '.es6', '.js', '.json']
  },
  plugins: [

    new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery'
    }),

  ]
};

0

Prova a usare - declare let $: any;

oppure importa * come $ da "jquery / dist / jquery.min.js"; fornire il percorso esatto della libreria lib


0

la soluzione al dattiloscritto:

Passo 1:

npm install jquery

npm install --save-dev @types/jquery

step2: in Angular.json aggiungi:

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

o in index.html aggiungi:

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

step3: in * .component.ts dove vuoi usare jquery

import * as $ from 'jquery';  // dont need "declare let $"

Quindi puoi usare jquery come javaScript. In questo modo, VScode supporta l'auto-suggerimento tramite Typescript


-3
ngOnInit() {
     const $ = window["$"];
     $('.flexslider').flexslider({
        animation: 'slide',
        start: function (slider) {
          $('body').removeClass('loading')
        }
     })
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.