Как использовать jQuery с Angular?
Может ли кто-нибудь сказать мне, как использовать jQuery с Angular?
class MyComponent {
constructor() {
// how to query the DOM element from here?
}
}
Я знаю, что есть обходные пути, такие как манипулирование классом или идентификатором элемента DOM, но я надеюсь на более чистый способ сделать это.
Ответы
Ответ 1
Использование jQuery из Angular2 - это бриз по сравнению с ng1. Если вы используете TypeScript, вы можете сначала указать определение jQuery TypeScript.
tsd install jquery --save
or
typings install dt~jquery --global --save
TypcriptDefinitions не требуется, поскольку вы можете просто использовать any
как тип для $
или jQuery
В вашем компоненте angular вы должны ссылаться на элемент 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
tslint будет жаловаться на chosen
, не являющийся свойством на $, чтобы исправить это, вы можете добавить определение в интерфейс JQuery в свой собственный файл *.d.ts
interface JQuery {
chosen(options?:any):JQuery;
}
Ответ 2
Почему все делают это ракетной наукой?
Для всех, кто должен делать некоторые базовые вещи на статических элементах, например, тег body
, просто выполните следующее:
- В index.html добавить тег
script
с помощью пути к вашей jquery lib, не имеет значения, где (таким образом вы можете также использовать условные теги IE для загрузки более низкой версии jquery для IE9 и меньше).
- В блоке
export component
есть функция, которая вызывает ваш код: $("body").addClass("done");
Normaly, это вызывает ошибку объявления, поэтому сразу после импорта в этом .ts файле добавьте declare var $:any;
, и вам хорошо идти!
Ответ 3
Это то, что сработало для меня.
ШАГ 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();
#UPDATE - Feb - 2017
В последнее время я пишу код ES6
вместо typescript
и могу import
без * as $
в import statement
. Это выглядит так:
import $ from 'jquery';
//
$('#elemId').width();
Удачи.
Ответ 4
Теперь стало очень легко, вы можете сделать это, просто объявив переменную jQuery с любым типом внутри контроллера Angular2.
declare var jQuery:any;
Добавьте это сразу после операторов импорта и перед декодером компонентов.
Чтобы получить доступ к любому элементу с идентификатором X или классом X, вам просто нужно сделать
jQuery("#X or .X").someFunc();
Ответ 5
Простой способ:
1. включают script
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;";
}
Ответ 6
Просьба выполнить следующие простые шаги. Это сработало для меня. Давайте начнем с нового приложения 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". Вы также должны использовать крючок для nqAfterViewInit(). После внесения изменений файл будет выглядеть так:
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" и протестируйте его. Он должен работать.
Ответ 7
Вы можете реализовать привязку жизненного цикла 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;
}
}
}
Ответ 8
Я делаю это проще: сначала установите 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});
...
}
}
В тесте, который я имею, например:
<div class="departments-connections-graph">something...</div>
ИЗМЕНИТЬ
Альтернативно вместо использования:
let $ = require('../../../../../node_modules/jquery/dist/jquery.min.js');
использование
declare var $: any;
и в вашем index.html put:
<script src="assets/js/jquery-2.1.1.js"></script>
Это будет инициализировать jquery только один раз globaly - это важно, например, для использования модальных окон в бутстрапе...
Ответ 9
шаг 1: используйте команду: npm install jquery --save
Шаг 2: вы можете просто импортировать angular как:
import $from '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'));
}
}
Ответ 10
//установка jquery npm install jquery --save
//установка определения типа для jquery typings 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(){}
}
Ответ 11
Если вы используете angular -cli, вы можете сделать:
-
Установить зависимость:
npm установить jquery --save
npm install @types/jquery --save-dev
-
Импортировать файл:
Добавьте "../ node_modules/jquery/dist/jquery.min.js" в раздел "script" в файле .angular-cli.json
-
Объявить jquery:
Добавьте "$" в раздел "типы" tsconfig.app.json
Вы можете найти более подробную информацию о официальном angular cli doc
Ответ 12
Использование 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
}
Ответ 13
Так как я сумасшедший, я подумал, что было бы хорошо иметь какой-то рабочий код.
Кроме того, Angular2 типизированная версия angular -protractor имеет проблемы с jQuery $
, поэтому верхний принятый ответ doesn Не дай мне чистый компилятор.
Вот шаги, которые я должен был выполнить:
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);
}
}
Ответ 14
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 date picker.
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
}
});
}
}
Эта работа для меня.
Ответ 15
Просто пиши
declare var $:any;
после всех разделов импорта вы можете использовать jQuery и включить библиотеку jQuery на страницу index.html.
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
это сработало для меня
Ответ 16
Я пропускаю установку 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';
Ответ 17
Наиболее эффективным способом, который я нашел, является использование setTimeout со временем 0 внутри конструктора страницы/компонента. Это позволяет jQuery запускаться в следующем цикле выполнения после завершения Angular загрузки всех дочерних компонентов. Можно использовать несколько других методов компонентов, но все, что я пробовал работать лучше всего, когда вы запускаете внутри setTimeout.
export class HomePage {
constructor() {
setTimeout(() => {
// run jQuery stuff here
}, 0);
}
}
Ответ 18
Вот что сработало для меня - Angular 2 с webpack
Я попытался объявить $
как тип any
, но всякий раз, когда я пытался использовать любой модуль JQuery, который я получал (например), $(..).datepicker()
не является функцией
Поскольку у меня есть Jquery, включенный в файл vendor.ts, я просто импортировал его в свой компонент, используя
import * as $ from 'jquery';
Теперь я могу использовать плагины JQuery (например, bootstrap-datetimepicker)
Ответ 19
Вы также можете попробовать импортировать его с помощью "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 },
];
При правильной установке в вашем приложении .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();
}
}
Ответ 20
Установите 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
в styles.css
)
@import "~bootstrap/dist/css/bootstrap.min.css";
Ответ 21
Установка Глобальной библиотеки как официальная документация здесь
-
Установить с npm:
npm install jquery --save
-
Добавьте необходимые файлы сценариев в сценарии:
"scripts": [ "node_modules/jquery/dist/jquery.slim.js" ],
Перезапустите сервер, если вы его используете, и он должен работать в вашем приложении.
Если вы хотите использовать внутри одного компонента, используйте import $ from 'jquery';
внутри вашего компонента
Ответ 22
Мои два цента на эту тему: ответ Васима Хаята (который, скорее всего, дурак) работает для меня на Angular 7 (и я верю в предыдущие версии Angular 2+). Это ИМХО самое простое.
Ответ 23
Когда вы используете Angular, старайтесь не использовать библиотеку jquery. Попробуйте использовать функции и библиотеки, которые создаются для угловой структуры. Если вы хотите использовать функции jquery, такие как find(), html(), closest() и т.д., Я предлагаю использовать чистый js. пример: querySelector(), innerHTML, parentElement и т. д...
Ответ 24
Использование 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
});
});
}
}
Ответ 25
Другие уже размещены. но я привожу простой пример, чтобы помочь некоторым новичкам.
Шаг 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.