Как использовать плагин jQuery с Angular 4?


85

Я хочу использовать ползунок диапазона в проекте angular, и я попытался использовать один доступный модуль для 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 install jquery && typings install dt ~ jquery --global --save
Johannes

@Johannes См. Документы машинописного текста для типизации typescriptlang.org/docs/handbook/declaration-files/… , microsoft.github.io/TypeSearch
Эрвин Ллойку

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 '$'
Grungondola

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

Это хорошо работает с Angular 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файле. Так что, если кто-то столкнется с этой проблемой, ему просто нужно их заявить.
Amr

У меня были проблемы в прошлом, когда упомянутые операторы импорта были необходимы, чтобы компилятор TS не жаловался. Однако я недавно обновил свои пакеты, и теперь эти операторы импорта не позволяют определять мои сторонние плагины. Вот моя текущая конфигурация: Angular версия: 4.4.7 @ angular / cli @ 1.7.4 jquery@3.3.1 typescript@2.3.4
nthaxis

13

Вы не должны использовать jQuery в Angular. Хотя это возможно (см. Другие ответы на этот вопрос), это не рекомендуется. Зачем?

Angular хранит собственное представление DOM в своей памяти и не использует селекторы запросов (например, функции document.getElementById(id)), такие как jQuery. Вместо этого все DOM-манипуляции выполняются Renderer2 (и Angular-директивами, такими как * ngFor и * ngIf, обращающимися к этому Renderer2 в фоновом / framework-коде). Если вы сами манипулируете 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.

TL; DR: чтобы узнать, как управлять 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-example


Я понимаю вашу точку зрения. Но как получить доступ к DOM и изменить его на angular. Например, $ ('. Js-eachoption [data-id =' + parentId + ']'). Closest ('. EachLevel'). After (html); Как это сделать с помощью просто angular.
Pradeep

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

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

Попробуйте использовать - declare let $: any;

или импортировать * как $ из 'jquery / dist / jquery.min.js'; укажите точный путь к библиотеке


0

решение машинописного текста:

Шаг 1:

npm install jquery

npm install --save-dev @types/jquery

step2: в 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>

step3: в * .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.