Как использовать jQuery с Angular?
Может кто-нибудь сказать мне, как использовать JQuery с Angular?
class MyComponent {
constructor() {
// how to query the DOM element from here?
}
}
Я знаю, что есть обходные пути, такие как манипулирование классом или идентификатором элемента DOM заранее, но я надеюсь на более чистый способ сделать это.
27 ответов
Использование jQuery от Angular2 - это бриз по сравнению с ng1. Если вы используете TypeScript, вы можете сначала обратиться к определению машинописи jQuery.
tsd install jquery --save
or
typings install dt~jquery --global --save
TypescriptDefinitions не требуются, так как вы можете просто использовать any
как тип для $
или же jQuery
В вашем угловом компоненте вы должны ссылаться на элемент DOM из шаблона, используя @ViewChild()
После инициализации представления вы можете использовать nativeElement
Свойство этого объекта и передать JQuery.
декларирование $
(или же jQuery
), поскольку JQueryStatic даст вам типизированную ссылку на jQuery.
import {bootstrap} from '@angular/platform-browser-dynamic';
import {Component, ViewChild, ElementRef, AfterViewInit} from '@angular/core';
declare var $:JQueryStatic;
@Component({
selector: 'ng-chosen',
template: `<select #selectElem>
<option *ngFor="#item of items" [value]="item" [selected]="item === selectedValue">{{item}} option</option>
</select>
<h4> {{selectedValue}}</h4>`
})
export class NgChosenComponent implements AfterViewInit {
@ViewChild('selectElem') el:ElementRef;
items = ['First', 'Second', 'Third'];
selectedValue = 'Second';
ngAfterViewInit() {
$(this.el.nativeElement)
.chosen()
.on('change', (e, args) => {
this.selectedValue = args.selected;
});
}
}
bootstrap(NgChosenComponent);
Этот пример доступен на плункере: http://plnkr.co/edit/Nq9LnK?p=preview
Цлинт будет жаловаться chosen
не являясь свойством в $, чтобы исправить это, вы можете добавить определение к интерфейсу JQuery в свой файл *.d.ts
interface JQuery {
chosen(options?:any):JQuery;
}
Это то, что сработало для меня.
ШАГ 1 - Перво-наперво
// In the console
// First install jQuery
npm install --save jquery
// and jQuery Definition
npm install -D @types/jquery
ШАГ 2 - ИМПОРТ
// Now, within any of the app files (ES2015 style)
import * as $ from 'jquery';
//
$('#elemId').width();
// OR
// CommonJS style - working with "require"
import $ = require('jquery')
//
$('#elemId').width();
#ОБНОВИТЬ - Feb - 2017
В последнее время я пишу код с ES6
вместо typescript
и могу import
без * as $
в import statement
, Вот как это выглядит сейчас:
import $ from 'jquery';
//
$('#elemId').width();
Удачи.
Почему все делают это ракетостроением? Для тех, кто хочет сделать что-то простое на статических элементах, например: body
тег, просто сделайте это:
- В index.html добавить
script
тег с путем к вашей библиотеке jquery, не имеет значения, где (таким образом, вы также можете использовать условные теги IE, чтобы загрузить более низкую версию jquery для IE9 и менее). - В вашем
export component
Блок имеет функцию, которая вызывает ваш код:$("body").addClass("done");
Обычно это приводит к ошибке объявления, поэтому после импорта в этот файл.ts добавьтеdeclare var $:any;
и тебе хорошо идти!
Теперь это стало очень просто. Вы можете сделать это, просто объявив переменную jQuery любого типа внутри контроллера Angular2.
declare var jQuery:any;
Добавьте это сразу после операторов импорта и перед декоратором компонента.
Чтобы получить доступ к любому элементу с идентификатором X или Class X, вам просто нужно сделать
jQuery("#X or .X").someFunc();
Простой способ:
1. включить скрипт
index.html
<script type="text/javascript" src="assets/js/jquery-2.1.1.min.js"></script>
2. объявить
my.component.ts
declare var $: any;
3. использовать
@Component({
selector: 'home',
templateUrl: './my.component.html',
})
export class MyComponent implements OnInit {
...
$("#myselector").style="display: none;";
}
Пожалуйста, следуйте этим простым шагам. Это сработало для меня. Давайте начнем с нового приложения Angular 2, чтобы избежать путаницы. Я использую Angular Cli. Итак, установите его, если у вас его еще нет. https://cli.angular.io/
Шаг 1. Создайте демонстрационное приложение Angular 2
ng new jquery-demo
Вы можете использовать любое имя. Теперь проверьте, работает ли он, запустив ниже cmd. (Теперь убедитесь, что вы указываете на 'jquery-demo', если не используете команду cd)
ng serve
вы увидите "приложение работает!" в браузере
Шаг 2: Установите Bower (менеджер пакетов для Интернета)
Запустите эту команду на cli (убедитесь, что вы указываете на 'jquery-demo', если не используете команду cd):
npm i -g bower --save
Теперь, после успешной установки bower, создайте файл 'bower.json' с помощью следующей команды:
bower init
Он будет запрашивать ввод, просто нажмите Enter для всех, если вы хотите значения по умолчанию, и в конце введите "Да", когда он спросит "Хорошо выглядит?"
Теперь вы можете увидеть новый файл (bower.json) в папке "jquery-demo". Вы можете найти больше информации на https://bower.io/
Шаг 3: Установите jquery
Запустите эту команду
bower install jquery --save
Это создаст новую папку (bower_components), которая будет содержать установочную папку jquery. Теперь у вас установлен jquery в папке 'bower_components'.
Шаг 4: Добавьте местоположение jquery в файл angular-cli.json
Откройте файл "angular-cli.json" (присутствует в папке "jquery-demo") и добавьте расположение jquery в "scripts". Это будет выглядеть так:
"scripts": ["../bower_components/jquery/dist/jquery.min.js"
]
Шаг 5: написать простой код jquery для тестирования
Откройте файл app.component.html и добавьте простую строку кода. Файл будет выглядеть так:
<h1>
{{title}}
</h1>
<p>If you click on me, I will disappear.</p>
Теперь откройте файл app.component.ts и добавьте объявление переменной jquery и код для тега p. Вы должны также использовать хук жизненного цикла ngAfterViewInit(). После внесения изменений файл будет выглядеть так:
import { Component, AfterViewInit } from '@angular/core';
declare var $:any;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app works!';
ngAfterViewInit(){
$(document).ready(function(){
$("p").click(function(){
$(this).hide();
});
});
}
}
Теперь запустите приложение angular 2 с помощью команды 'ng serve' и протестируйте его. Он должен работать.
Использование Angular Cli
npm install jquery --save
В angular.json под массив скриптов
"scripts": [ "../node_modules/jquery/dist/jquery.min.js" ] //for latest version copy full path of node_modules>jquery>dist>jquery.min.js to avoid path error
Теперь, чтобы использовать jQuery, все, что вам нужно сделать, это импортировать его следующим образом в любой компонент, который вы хотите использовать jQuery.
import * as $ from 'jquery';
Например, используя jQuery в корневом компоненте
import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
public ngOnInit()
{
//jQuery code
});
});
}
}
Если вы используете angular-cli, вы можете сделать:
Установите зависимость:
npm установить jquery --save
npm install @ types / jquery --save-dev
Импортируйте файл:
Добавьте "../node_modules/jquery/dist/jquery.min.js" в раздел "script" в файле.angular-cli.json
Объявить jquery:
Добавьте "$" в раздел "types" tsconfig.app.json
Вы можете найти более подробную информацию на официальном угловом документе.
Шаг 1: используйте команду: npm install jquery --save
шаг 2: вы можете просто импортировать angular как:
импортировать $ из 'jquery';
это все.
Примером может быть:
import { Component } from '@angular/core';
import $ from 'jquery';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
constructor(){
console.log($('body'));
}
}
Вы можете реализовать хук жизненного цикла ngAfterViewInit(), чтобы добавить некоторые манипуляции с DOM
ngAfterViewInit() {
var el:any = elelemtRef.domElement.children[0];
$(el).chosen().on('change', (e, args) => {
_this.selectedValue = args.selected;
});
}
Будьте осторожны при использовании маршрутизатора, поскольку angular2 может перезапускать представления... поэтому вы должны быть уверены, что манипуляции с элементами DOM выполняются только при первом вызове afterViewInit .. (для этого можно использовать статические логические переменные)
class Component {
let static chosenInitialized : boolean = false;
ngAfterViewInit() {
if (!Component.chosenInitialized) {
var el:any = elelemtRef.domElement.children[0];
$(el).chosen().on('change', (e, args) => {
_this.selectedValue = args.selected;
});
Component.chosenInitialized = true;
}
}
}
Я делаю это проще - сначала установите jquery с помощью npm в консоли: npm install jquery -S
а затем в файле компонента я просто пишу: let $ = require('.../jquery.min.js')
и это работает! Вот полный пример из некоторого моего кода:
import { Component, Input, ElementRef, OnInit } from '@angular/core';
let $ = require('../../../../../node_modules/jquery/dist/jquery.min.js');
@Component({
selector: 'departments-connections-graph',
templateUrl: './departmentsConnectionsGraph.template.html',
})
export class DepartmentsConnectionsGraph implements OnInit {
rootNode : any;
container: any;
constructor(rootNode: ElementRef) {
this.rootNode = rootNode;
}
ngOnInit() {
this.container = $(this.rootNode.nativeElement).find('.departments-connections-graph')[0];
console.log({ container : this.container});
...
}
}
В teplate у меня есть, например:
<div class="departments-connections-graph">something...</div>
РЕДАКТИРОВАТЬ
В качестве альтернативы вместо использования:
let $ = require('../../../../../node_modules/jquery/dist/jquery.min.js');
использование
declare var $: any;
и в ваш index.html положить:
<script src="assets/js/jquery-2.1.1.js"></script>
Это инициализирует jquery только один раз в глобальном масштабе - это важно, например, для использования модальных окон в начальной загрузке...
// установка jquerynpm install jquery --save
// установка определения типа для jquerytypings install dt~jquery --global --save
// добавляем библиотеку jquery в файл конфигурации сборки, как указано (в файле "angular-cli-build.js")
vendorNpmFiles: [
.........
.........
'jquery/dist/jquery.min.js'
]
// запускаем сборку для добавления библиотеки jquery в сборку ng build
// добавление конфигурации относительного пути (в system-config.js) /** Map relative paths to URLs. */
const map: any = {
.....,
.......,
'jquery': 'vendor/jquery/dist'
};
/** User packages configuration. */
const packages: any = {
......,
'jquery':{ main: 'jquery.min',
format: 'global',
defaultExtension: 'js'}};
// импортируем библиотеку jquery в ваш файл компонента
import 'jquery';
ниже приведен фрагмент кода моего примера компонента
import { Component } from '@angular/core';
import 'jquery';
@Component({
moduleId: module.id,
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent {
list:Array<number> = [90,98,56,90];
title = 'app works!';
isNumber:boolean = jQuery.isNumeric(89)
constructor(){}
}
Использовать Jquery в Angular2(4)
Следуйте этим шагам
установить определение типа Jquery и Juqry
Для установки Jquery npm install jquery --save
Для определения типа Jquery Установка npm install @types/jquery --save-dev
а затем просто импортировать JQuery
import { Component } from '@angular/core';
import * as $ from 'jquery';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
console.log($(window)); // jquery is accessible
}
Сначала установите jQuery с помощью npm следующим образом:
npm install jquery — save
Во-вторых, перейдите в файл./angular-cli.json в корне папки проекта Angular CLI, найдите свойство scripts: [] и укажите путь к jQuery следующим образом:
"scripts": [ "../node_modules/jquery/dist/jquery.min.js" ]
Теперь, чтобы использовать jQuery, все, что вам нужно сделать, это импортировать его в любой компонент, который вы хотите использовать jQuery.
import * as $ from 'jquery';
(or)
declare var $: any;
Взгляните на приведенный ниже код, который использует jQuery для анимации div при нажатии, особенно во второй строке. Мы импортируем все как $ из jQuery.
import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'Look jQuery Animation working in action!';
public ngOnInit()
{
$(document).ready(function(){
$("button").click(function(){
var div = $("div");
div.animate({left: '100px'}, "slow");
div.animate({fontSize: '5em'}, "slow");
});
});
}
}
Угловой 12
npm i jquery
это важно :
npm i @types/jquery
angular.json
"scripts": [
"node_modules/jquery/dist/jquery.min.js"
]
.ts файл
import * as $ from "jquery";
Просто пиши
declare var $:any;
после всех разделов импорта вы можете использовать jQuery и включить библиотеку jQuery на страницу index.html.
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
это сработало для меня
Я пропускаю установку jquery, так как этот момент упоминался во всех постах, созданных до меня. Итак, вы уже установили jquery. Импортировать т в ваш компонент, как это
import * as $ from 'jquery';
будет работать, но есть другой "угловой" способ сделать это путем создания службы.
Шаг № 1: создать файл jquery.service.ts.
// in Angular v2 it is OpaqueToken (I am on Angular v5)
import { InjectionToken } from '@angular/core';
export const JQUERY_TOKEN = new InjectionToken('jQuery');
Шаг. нет. 2: зарегистрировать сервис в app.module.ts
import { JQUERY_TOKEN } from './services/jQuery.service';
declare const jQuery: Object;
providers: [
{ provide: JQUERY_TOKEN, useValue: jQuery },
]
Шаг № 3: внедрить сервис в ваш компонент my-super-duper.component.ts
import { Component, Inject } from '@angular/core';
export class MySuperDuperComponent {
constructor(@Inject(JQUERY_TOKEN) private $: any) {}
someEventHandler() {
this.$('#my-element').css('display', 'none');
}
}
Буду очень признателен, если кто-нибудь сможет объяснить плюсы и минусы обоих методов: DI jquery как сервис против импорта * как $ из 'jquery';
Так как я тупица, я подумал, что было бы хорошо иметь какой-нибудь рабочий код.
Кроме того, версия angular-транспортир Angular2 имеет проблемы с jQuery $
таким образом, верхний принятый ответ не дает мне чистую компиляцию.
Вот шаги, которые я должен работать:
index.html
<head>
...
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
...
</head>
Внутри my.component.ts
import {
Component,
EventEmitter,
Input,
OnInit,
Output,
NgZone,
AfterContentChecked,
ElementRef,
ViewChild
} from "@angular/core";
import {Router} from "@angular/router";
declare var jQuery:any;
@Component({
moduleId: module.id,
selector: 'mycomponent',
templateUrl: 'my.component.html',
styleUrls: ['../../scss/my.component.css'],
})
export class MyComponent implements OnInit, AfterContentChecked{
...
scrollLeft() {
jQuery('#myElement').animate({scrollLeft: 100}, 500);
}
}
Другие уже размещены. но я привожу простой пример, чтобы помочь некоторым новичкам.
Шаг 1: В вашем файле index.html ссылка на jquery cdn
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
Шаг 2: предположим, что мы хотим показать div или скрыть div при нажатии кнопки:
<input type="button" value="Add New" (click)="ShowForm();">
<div class="container">
//-----.HideMe{display:none;} is a css class----//
<div id="PriceForm" class="HideMe">
<app-pricedetails></app-pricedetails>
</div>
<app-pricemng></app-pricemng>
</div>
Шаг 3: В приведенном ниже файле компонента импорт объявляет $ как ниже:
declare var $: any;
чем создать функцию, как показано ниже:
ShowForm(){
$('#PriceForm').removeClass('HideMe');
}
Он будет работать с последними версиями Angular и JQuery.
1) Для доступа к DOM в компоненте.
import {BrowserDomAdapter } from '@angular/platform-browser/src/browser/browser_adapter';
constructor(el: ElementRef,public zone:NgZone) {
this.el = el.nativeElement;
this.dom = new BrowserDomAdapter();
}
ngOnInit() {
this.dom.setValue(this.el,"Adding some content from ngOnInit");
}
Вы можете включить jQuery следующим образом. 2) Включите ваш файл jquery в index.html перед загрузкой angular2
<head>
<title>Angular 2 QuickStart</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="styles.css">
<!-- jquery file -->
<script src="js/jquery-2.0.3.min.js"></script>
<script src="js/jquery-ui.js"></script>
<script src="node_modules/es6-shim/es6-shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
</head>
Вы можете использовать Jquery следующим образом, здесь я использую JQuery Ui выбора даты.
import { Directive, ElementRef} from '@angular/core';
declare var $:any;
@Directive({
selector: '[uiDatePicker]',
})
export class UiDatePickerDirective {
private el: HTMLElement;
constructor(el: ElementRef) {
this.el = el.nativeElement;
}
ngOnInit() {
$(this.el).datepicker({
onSelect: function(dateText:string) {
//do something on select
}
});
}
}
Это работа для меня.
Установка Глобальной библиотеки как официальная документация здесь
Установить с npm:
npm install jquery --save
Добавьте необходимые файлы сценариев в сценарии:
"scripts": [ "node_modules/jquery/dist/jquery.slim.js" ],
Перезапустите сервер, если вы его используете, и он должен работать в вашем приложении.
Если вы хотите использовать внутри одного компонента использования import $ from 'jquery';
внутри вашего компонента
Самый эффективный способ, который я нашел, это использовать setTimeout со временем 0 внутри конструктора страницы / компонента. Это позволит запустить jQuery в следующем цикле выполнения после того, как Angular завершит загрузку всех дочерних компонентов. Можно использовать несколько других компонентных методов, но все, что я пробовал, работают лучше всего при запуске внутри setTimeout.
export class HomePage {
constructor() {
setTimeout(() => {
// run jQuery stuff here
}, 0);
}
}
Вы также можете попробовать импортировать его с помощью "InjectionToken". Как описано здесь: Используйте jQuery в Angular/Typescript без определения типа
Вы можете просто внедрить глобальный экземпляр jQuery и использовать его. Для этого вам не понадобятся какие-либо определения типов или наборы.
import { InjectionToken } from '@angular/core';
export const JQ_TOKEN = new InjectionToken('jQuery');
export function jQueryFactory() {
return window['jQuery'];
}
export const JQUERY_PROVIDER = [
{ provide: JQ_TOKEN, useFactory: jQueryFactory },
];
Когда правильно установлено в вашем app.module.ts:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { JQ_TOKEN } from './jQuery.service';
declare let jQuery: Object;
@NgModule({
imports: [
BrowserModule
],
declarations: [
AppComponent
],
providers: [
{ provide: JQ_TOKEN, useValue: jQuery }
],
bootstrap: [AppComponent]
})
export class AppModule { }
Вы можете начать использовать его в своих компонентах:
import { Component, Inject } from '@angular/core';
import { JQ_TOKEN } from './jQuery.service';
@Component({
selector: "selector",
templateUrl: 'somefile.html'
})
export class SomeComponent {
constructor( @Inject(JQ_TOKEN) private $: any) { }
somefunction() {
this.$('...').doSomething();
}
}
добавьте этот код Ниже в src/Main.ts будут важные jquery и все функции во всем проекте
import * as jquery from 'jquery';
import * as bootstrap from 'bootstrap';
не забудьте npm i @types/jquery и npm i @types/bootstrap
Вот что у меня сработало - Angular 2 с веб-пакетом
Я пытался объявить $
как тип any
но всякий раз, когда я пытался использовать любой модуль JQuery, я получал (например) $(..).datepicker()
это не функция
Поскольку Jquery включен в мой файл vendor.ts, я просто импортировал его в свой компонент, используя
import * as $ from 'jquery';
Теперь я могу использовать плагины Jquery (например, bootstrap-datetimepicker)
Когда вы используете Angular, старайтесь не использовать библиотеку jquery. Попробуйте использовать функции и библиотеки, которые создаются для угловой структуры. Если вы хотите использовать функции jquery, такие как find (), html (), closest () и т. Д., Я предлагаю использовать чистый js. пример: querySelector (), innerHTML, parentElement и т. д...
Установите jquery
Терминал $ npm install jquery
(Для начальной загрузки 4...)
Терминал $ npm install popper.js
Терминал $ npm install bootstrap
Затем добавьте import
заявление к app.module.ts
,
import 'jquery'
(Для начальной загрузки 4...)
import 'popper.js'
import 'bootstrap'
Теперь вам больше не нужно <SCRIPT>
теги для ссылки на JavaScript.
(Любой CSS, который вы хотите использовать, все еще должен быть указан в styles.css
)
@import "~bootstrap/dist/css/bootstrap.min.css";