Jak korzystać z wtyczki jQuery w Angular 4?


85

Chcę użyć suwaka zakresu w projekcie kątowym i próbowałem użyć jednego dostępnego modułu dla kątowego 4.

Działa dobrze podczas kompilacji, ale kiedy próbuję zbudować go do wdrożenia, generuje poniższy błąd.

wprowadź opis obrazu tutaj

Sprawdziłem opcję używania wtyczki jQuery bezpośrednio w projekcie angular i dostaję opcje robienia tego tylko w Angular 2.

Czy jest jakiś sposób, abyśmy mogli używać wtyczek jQuery w Angular 4?

Proszę daj mi znać.

Z góry dziękuję!


1
Owinąć go w komponent: hackernoon.com/... Nie ma różnicy między NG2 i NG4 z tej perspektywy.
Razvan Dumitru

Odpowiedzi:


160

Tak, możesz używać jquery z Angular 4

Kroki:

1) index.htmlUmieść poniżej linii w tagu.

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

2) W poniższym pliku komponentu ts musisz zadeklarować var ​​w ten sposób

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

}

I użyj tego kodu dla odpowiedniego pliku HTML w następujący sposób:

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

To zadziała dla Ciebie. Dzięki


1
Zadziałało!! Jak używałbyś rozszerzonych wtyczek, takich jak jquery-ui?
Tushar

1
rozwiązane: npm install jquery && typings install dt ~ jquery --global --save
Johannes

@Johannes Zapoznaj się z dokumentacją maszynopisu dla maszynopisów typescriptlang.org/docs/handbook/declaration-files/… , microsoft.github.io/TypeSearch
Ervin Llojku

4
@ Jota.Toledo, jak przypuszczasz, że należy to zrobić? Czy masz dodatkowe informacje o tym, jak to zrobić?
Lucas Medina

3
@ Jota.Toledo masz na myśli dodanie go do angular-cli.json? Wydaje się to bardzo praktyczne :) dzięki za radę
Lucas Medina

190

Zainstaluj jquery przy użyciu npm

npm install jquery --save

Dodaj typy

npm install --save-dev @types/jquery

Dodaj skrypty do angular-cli.json

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

Buduj projekt i obsługuj

ng build

Mam nadzieję że to pomoże! Ciesz się kodowaniem


11
Nie zapomnij również add declare var jquery:any; declare var $ :any;o pliku .ts.

19
@Norx instrukcje obejmują instalację typów, co oznacza, że ​​twoje linie nie są potrzebne.
salbahra

5
Gdy to robię, pojawiają się błędy kompilacji. Mam zainstalowany jquery 3.2.1 z typami, więc nie wyświetla mi błędów w kodzie, ale nadal Cannot find name '$'
pojawiają się

1
@Grungondola dodaj declare const $: any;nad dekoratorem @ ....
Ervin Llojku

Czy to dobrze współgra z zone.js w Angular?
Wolf359

34

Zainstaluj jQuery za pomocą NPM Jquery NPM

npm install jquery

Zainstaluj plik deklaracji jQuery

npm install -D @types/jquery

Importuj jQuery do .ts

import * as $ from 'jquery';

zadzwoń w klasie

export class JqueryComponent implements OnInit {

constructor() {
}

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

}

27

Nie musisz deklarować żadnej zmiennej jQuery podczas instalowania @ types / jquery.

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

Powinieneś mieć dostęp do jQuery wszędzie.

Powinno działać:

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

1
Otrzymuję ten błąd, Cannot find name 'jQuery'jeśli nie deklaruję ich w .tspliku. Więc jeśli ktoś napotka ten problem, musi go tylko zgłosić.
Amr

W przeszłości miałem problemy, w których wspomniane instrukcje importu były wymagane, aby kompilator TS nie narzekał. Jednak ostatnio zaktualizowałem moje pakiety i teraz te instrukcje importu powodują, że moje wtyczki innych firm nie są zdefiniowane. Oto moja obecna konfiguracja: Wersja kątowa: 4.4.7 @ angular / cli @ 1.7.4 jquery@3.3.1 typescript@2.3.4
nthaxis

13

Nie należy używać jQuery w Angular. Chociaż jest to możliwe (zobacz inne odpowiedzi na to pytanie), odradza się. Czemu?

Angular przechowuje własną reprezentację DOM w swojej pamięci i nie używa selektorów zapytań (takich jak funkcje document.getElementById(id)), takich jak jQuery. Zamiast tego cała manipulacja DOM jest wykonywana przez Renderer2 (i dyrektywy Angular, takie jak * ngFor i * ngIf, które uzyskują dostęp do tego Renderer2 w kodzie tła / struktury). Jeśli samodzielnie manipulujesz DOM za pomocą jQuery, prędzej czy później ...

  1. Występują problemy z synchronizacją i pojawiają się błędy lub nie znikają we właściwym czasie z ekranu
  2. Występują problemy z wydajnością w bardziej złożonych komponentach, ponieważ wewnętrzna reprezentacja DOM Angulara jest powiązana z zone.js i jego mechanizmem wykrywania zmian - więc ręczna aktualizacja DOM zawsze blokuje wątek, w którym działa Twoja aplikacja.
  3. Masz inne zagmatwane błędy, których nie znasz.
  4. Brak możliwości prawidłowego przetestowania aplikacji (Jasmine wymaga, abyś wiedział, kiedy elementy zostały wyrenderowane)
  5. Brak możliwości korzystania z Angular Universal lub WebWorkers

Jeśli naprawdę chcesz dołączyć jQuery (do nagrywania przez kaczkę jakiegoś prototypu, który w 100% definitywnie wyrzucisz), polecam przynajmniej dołączyć go do pliku package.json npm install --save jqueryzamiast pobierać go z CDN Google.

TLDR: Aby dowiedzieć się, jak manipulować DOM w sposób Angular, najpierw zapoznaj się z oficjalnym samouczkiem przewodnika po bohaterach: https://angular.io/tutorial/toh-pt2 Jeśli potrzebujesz dostępu do elementów znajdujących się wyżej w hierarchii DOM (rodzic lub document body) lub z jakiegoś innego powodu dyrektywy jak *ngIf, *ngForniestandardowe dyrektywy, rury i inne narzędzia, takie jak kątowe [style.background],[class.myOwnCustomClass] nie spełniają Twoich potrzeb, wykorzystanie Renderer2: https://www.concretepage.com/angular-2/angular-4 -renderer2-przykład


Rozumiem, o co chodzi. Ale jak uzyskać dostęp do DOM i zmienić go w kątowym. Na przykład $ ('.js-eachoption [data-id =' + parentId + ']'). Najbliższy ('. EachLevel'). After (html); Jak to zrobić za pomocą tylko kątowego.
Pradeep

3
@Pradeep w Angular zwykle nie zaczynasz szukać elementów wewnątrz DOM od głównego tagu html, chociaż jest to również możliwe (poprzez odwołanie się do DOCUMENT lub WINDOW wewnątrz dowolnego komponentu). Modularyzacja (do której stworzono Angular) wymusza tworzenie aplikacji w taki sposób, aby manipulować tylko elementami podrzędnymi z elementów nadrzędnych. W dłuższej perspektywie taka hierarchiczna zależność znacznie ułatwia tworzenie i utrzymanie kodu. Dlatego powinieneś próbować manipulować tylko elementem DOM hosta bieżącego komponentu lub dowolnego ViewChild lub ContentChild i ich dzieci.
Phil

@Pradeep Więc gdy pojawi się odwołanie do elementu ( constructor(private renderer: Renderer2, private el: ElementRef) {}), można filtr dla swoich dzieci lub manipulować element bezpośrednio dostępu To nativeElement-PROPERTY: ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); }. Oto samouczek, jak powiedzieć Ci więcej: alligator.io/angular/using-renderer2
Phil

@Pradeep, pamiętaj, że renderer2 nie jest jedyną opcją. W Angular możesz manipulować DOM bezpośrednio z szablonu. Na przykład, elementy DOM wewnątrz szablonu bieżącego składnika można łatwo obchodzić *ngIf, *ngForspecyfikacji klienta (przez Ciebie) dyrektyw, rur i CSS ngClass, [style.background]i [class.myCustomCssClass]. Aby uzyskać dalszą pomoc: angular.io/tutorial/toh-pt2
Phil

8

Spróbuj tego:

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

Lub dodaj skrypty do angular-cli.json:

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

aw pliku .ts:

declare var $: any;

1

Możesz zaktualizować swoją wersję jquery w ten sposób

npm install --save @types/jquery@latest

Miałem ten sam błąd i byłem w przypadku, gdy przez 5 dni surfowałem po sieci w poszukiwaniu rozwiązania. Zadziałało dla mnie i powinno działać dla ciebie


1

Jeśli potrzebujesz użyć innych bibliotek w projektach - typescript - nie tylko w projektach - angle - możesz poszukać tds (TypeScript Declaration File), które są depares i które mają informacje o metodach, typach, funkcjach itp., które mogą być używane przez TypeScript, zwykle bez konieczności importowania. deklaruj var jest ostatnim zasobem

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

1

Możesz użyć webpacka, aby to zapewnić . Następnie zostanie automatycznie wstrzyknięty DOM.

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

Spróbuj użyć - zadeklaruj let $: any;

lub importuj * jako $ z 'jquery / dist / jquery.min.js'; podaj dokładną ścieżkę do lib


0

rozwiązanie maszynopisu:

Krok 1:

npm install jquery

npm install --save-dev @types/jquery

krok 2 : w Angular.json dodaj:

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

lub w index.html dodaj:

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

step3: w * .component.ts, gdzie chcesz użyć jquery

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

Następnie możesz użyć jquery tak samo jak javaScript. W ten sposób VScode obsługuje automatyczne sugestie przez Typescript


-3
ngOnInit() {
     const $ = window["$"];
     $('.flexslider').flexslider({
        animation: 'slide',
        start: function (slider) {
          $('body').removeClass('loading')
        }
     })
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.