Як використовувати плагін jQuery з Angular 4?


85

Я хочу використовувати повзунок діапазону в кутовому проекті, і я спробував використовувати один доступний модуль для angular 4.

Він чудово працює під час компіляції, але коли я намагаюся створити його для розгортання, він видає помилку нижче.

введіть тут опис зображення

Я перевірив можливість використання плагіна jQuery безпосередньо в проекті angular, і я отримую варіанти для цього лише в Angular 2.

Чи можна якось використовувати плагіни jQuery в Angular 4?

Будь ласка, дай мені знати.

Спасибі заздалегідь!


1
Оберніть його в компонент: hackernoon.com/ ... З цієї точки зору між ng2 та ng4 немає різниці.
Разван Думітру

Відповіді:


160

Так, ви можете використовувати jquery з Angular 4

Кроки:

1) index.htmlВставте під тегом рядок нижче.

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

2) У наведеному нижче файлі компонента ts вам потрібно оголосити var таким чином

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

}

І використовуйте цей код для відповідного html-файлу таким чином:

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

Це буде працювати для вас. Дякую


1
Це спрацювало!! Як би ви використовували розширені плагіни, такі як jquery-ui?
Тушар

1
вирішено: npm встановити jquery && типізації встановити dt ~ jquery --global --save
Йоганнес

@Johannes Зверніться до машинопису документи для типізації typescriptlang.org/docs/handbook/declaration-files / ... , microsoft.github.io/TypeSearch
Ервін Llojku

4
@ Jota.Toledo, як ви вважаєте, що це слід робити? Чи є у вас додаткова інформація про правильний спосіб зробити це?
Лукас Медіна,

3
@ Jota.Toledo ви маєте на увазі додати його до angular-cli.json? Це здається справді практичним :) дякую за пораду
Лукас Медіна

190

Встановіть jquery з npm

npm install jquery --save

Додайте набори тексту

npm install --save-dev @types/jquery

Додайте скрипти до angular-cli.json

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

Побудуйте проект і обслуговуйте

ng build

Сподіваюся, це допомагає! Насолоджуйтесь кодуванням


11
Також не забудьте перейти add declare var jquery:any; declare var $ :any;до вашого .ts-файлу.

19
Інструкції @Norx включають встановлення типів, що означає, що ваші лінії не потрібні.
salbahra

5
Коли я роблю це, я отримую помилки збірки. У мене встановлено jquery 3.2.1 з типами, тому він не видає мені помилок у коді, але я все одно отримую помилки збірки із зазначенням:Cannot find name '$'
Грунгондола,

1
@Grungondola додати declare const $: any;над декоратором @ ...
Ервін Ллойку,

Чи добре це грає з Angular's zone.js?
Wolf359

34

Встановіть jQuery, використовуючи NPM Jquery NPM

npm install jquery

Встановіть файл декларації jQuery

npm install -D @types/jquery

Імпортуйте jQuery всередину .ts

import * as $ from 'jquery';

дзвінок всередині класу

export class JqueryComponent implements OnInit {

constructor() {
}

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

}

27

Вам не потрібно оголошувати будь-яку змінну jQuery під час встановлення @ types / jquery.

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

Ви повинні мати доступ до jQuery скрізь.

Має працювати наступне:

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

1
Я отримую цю помилку, Cannot find name 'jQuery'якщо не заявляю їх у .tsфайлі. Отже, якщо хтось стикається з цією проблемою, йому просто потрібно заявити про них.
Амр

У мене раніше були проблеми, коли згадані оператори імпорту ВИМОГАЛИ отримувати, щоб компілятор TS не скаржився. Однак нещодавно я оновив свої пакети, і тепер ці оператори імпорту призводять до того, що мої сторонні плагіни не визначаються. Ось моя поточна конфігурація: Кутова версія: 4.4.7 @ angular / cli @ 1.7.4 jquery@3.3.1 typecript@2.3.4
nthaxis

13

Не слід використовувати jQuery в Angular. Хоча це можливо (див. Інші відповіді на це питання), це не рекомендується. Чому?

Angular має власне представлення DOM у своїй пам'яті і не використовує селектори запитів (такі функції document.getElementById(id)), як jQuery. Натомість усі DOM-маніпуляції виконуються Renderer2 (і Angular-директиви, такі як * ngFor та * ngIf, що отримують доступ до цього Renderer2 у фоновому / фреймворк-коді). Якщо ви самі будете маніпулювати DOM за допомогою jQuery, ви рано чи пізно ...

  1. Виникають проблеми з синхронізацією, і речі можуть неправильно з’являтися або не зникати в потрібний час з екрана
  2. Виникають проблеми з продуктивністю в більш складних компонентах, оскільки внутрішнє DOM-представлення Angular прив’язане до zone.js та його механізму виявлення змін - тому оновлення DOM вручну завжди заблокує потік, на якому працює ваша програма.
  3. Майте інші заплутані помилки, про які ви не знаєте походження.
  4. Неможливість перевірити програму правильно (Жасмін вимагає, щоб ви знали, коли елементи були відтворені)
  5. Неможливість користуватися Angular Universal або WebWorkers

Якщо ви дійсно хочете включити jQuery (для кацювання какого-небудь прототипу, який ви на 100% остаточно викинете), я рекомендую принаймні включити його у свій package.json npm install --save jqueryзамість того, щоб отримувати його з CDN google.

TLDR: Щоб дізнатись, як маніпулювати DOM в Angular-способі, перейдіть спочатку до офіційного підручника героїв: https://angular.io/tutorial/toh-pt2 Якщо вам потрібен доступ до елементів вище в ієрархії DOM (батько або document body) або з якоїсь іншої причини директиви як *ngIf, *ngFor, призначені для користувача директиви, труба і інші кутові утиліти , такі як [style.background], [class.myOwnCustomClass] не задовольняють ваші потреби, використання Renderer2: https://www.concretepage.com/angular-2/angular-4 -renderer2-приклад


Я розумію, ви стверджуєте. Але як отримати доступ до DOM і змінити його в angular. Наприклад, наприклад, $ ('. Js-eachoption [data-id =' + parentId + ']'). Nearby ('. EachLevel'). After (html); Як це зробити за допомогою просто кутового.
Прадіп

3
@Pradeep в Angular ви зазвичай не починаєте шукати елементи всередині DOM з кореневого html-тегу, хоча це також можливо (посилаючись на DOCUMENT або WINDOW всередині будь-якого компонента). Модуляризація (для якої створено Angular) змушує вас створювати свій додаток таким чином, щоб ви маніпулювали лише дочірніми елементами з батьківських елементів. У довгостроковій перспективі така ієрархічна залежність значно спрощує розробку та підтримку коду. Отже, вам слід намагатися маніпулювати лише DOM-елементом хосту поточного компонента або будь-яким ViewChild або ContentChild та їхніми нащадками.
Філ

@Pradeep Отже , коли ви отримаєте посилання на елемент ( constructor(private renderer: Renderer2, private el: ElementRef) {}), ви можете або фільтр для своїх дітей або маніпулювати елементом безпосередньо до нього доступ в nativeElement-Нерухомість: ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); }. Ось підручник, як сказати вам більше: alligator.io/angular/using-renderer2
Філ

@Pradeep, будь ласка, майте на увазі, що renderer2 - це не ваш єдиний варіант. У Angular ви можете безпосередньо маніпулювати DOM із шаблону. Наприклад, DOM елементи всередині шаблону поточного компонента легко можуть бути оброблені з *ngIf, *ngFor, виготовлений на замовлення (зроблені вами) директиви, труб і для CSS ngClass, [style.background]і [class.myCustomCssClass]. За додатковою допомогою: angular.io/tutorial/toh-pt2
Філ

8

Спробуйте це:

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

Або додайте сценарії до angular-cli.json:

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

і у вашому .ts-файлі:

declare var $: any;

1

Ви можете оновити свою версію типів jquery так

npm install --save @types/jquery@latest

У мене була та сама помилка, і я був у тому випадку, якщо протягом 5 днів переглядав мережу для пошуку рішення. Це спрацювало для мене, і це повинно працювати для вас


1

Якщо у вас є потреба використовувати інші бібліотеки в проектах --typescript - не тільки в проектах - angle - ви можете шукати tds (Файл декларації TypeScript), які відрізняються і містять інформацію про методи, типи, функції тощо, який може використовуватися TypeScript, як правило, без необхідності імпорту. оголосити var - останній ресурс

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

1

Ви можете використовувати веб-пакет для його надання . Потім він автоматично вводиться 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

Спробуйте скористатися - оголосіть let $: any;

або імпортувати * як $ з 'jquery / dist / jquery.min.js'; забезпечити точний шлях ліб


0

рішення для машинопису:

Крок 1:

npm install jquery

npm install --save-dev @types/jquery

крок2 : у Angular.json додайте:

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

або в index.html додати:

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

stepp3: у * .component.ts, де ви хочете використовувати jquery

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

Тоді ви можете використовувати jquery так само, як javaScript. Таким чином, VScode підтримує автоматичну навіювання за допомогою Typescript


-3
ngOnInit() {
     const $ = window["$"];
     $('.flexslider').flexslider({
        animation: 'slide',
        start: function (slider) {
          $('body').removeClass('loading')
        }
     })
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.