谁能告诉我,如何使用jQuery的有角?
class MyComponent {
constructor() {
// how to query the DOM element from here?
}
}
我知道有一些变通方法,例如预先处理DOM元素的类或ID,但我希望有一种更干净的方法。
谁能告诉我,如何使用jQuery的有角?
class MyComponent {
constructor() {
// how to query the DOM element from here?
}
}
我知道有一些变通方法,例如预先处理DOM元素的类或ID,但我希望有一种更干净的方法。
Answers:
与ng1相比,使用来自Angular2的jQuery轻而易举。如果您使用的是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);
该示例可在plunker上找到:http ://plnkr.co/edit/Nq9LnK?p=preview
tslint将抱怨chosen
不是$的属性,要解决此问题,您可以在自定义* .d.ts文件的JQuery接口中添加定义
interface JQuery {
chosen(options?:any):JQuery;
}
setTimeout
需要解决方法。我尝试了其他几个jQuery组件,似乎所有这些组件都需要此变通办法来进行正确的初始化。我希望这会在ng2的未来版本中有所改变
为什么每个人都将它变成火箭科学?对于需要在静态元素上做一些基本工作(例如,body
标记)的其他人,只需执行以下操作:
script
带有您的jquery lib路径的标记,无论在哪里(这样,您也可以使用IE条件标记为IE9及更低版本的jquery加载较低版本的jquery)。export component
块中有一个调用代码的函数:$("body").addClass("done");
通常,这会导致声明错误,因此,在此.ts文件中的所有导入之后,添加declare var $:any;
就可以了!declare var $:any;
为了胜利!
这对我有用。
// In the console
// First install jQuery
npm install --save jquery
// and jQuery Definition
npm install -D @types/jquery
// 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();
祝好运。
import * as $ from 'jquery';
在app.module.ts中使其可用于整个项目。顺便说一句:“为什么--save而不是--save-dev?”
import $ from 'jquery';
那是此页imo上最漂亮的jquery import语句。正是我想要的样子。
现在,它变得非常容易,您只需在Angular2控制器内声明任何类型的jQuery变量即可完成此操作。
declare var jQuery:any;
在import语句之后和组件装饰器之前添加此代码。
要访问ID为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下运行来检查它是否正常工作(现在,如果不使用cd命令,请确保您指向的是'jquery-demo')
ng serve
您将看到“应用程序有效!” 在浏览器上。
步骤2:安装Bower(网络的程序包管理器)
在cli上运行以下命令(如果不使用cd命令,请确保指向“ jquery-demo”):
npm i -g bower --save
现在,成功安装Bower之后,请使用以下命令创建“ bower.json”文件:
bower init
它将要求输入,如果要使用默认值,则只需按Enter键,最后输入“是”,然后询问“看起来好吗?”。
现在,您可以在文件夹“ jquery-demo”中看到一个新文件(bower.json)。您可以在https://bower.io/上找到更多信息。
步骤3:安装jquery
运行此命令
bower install jquery --save
它将创建一个新文件夹(bower_components),其中将包含jquery安装文件夹。现在,您已经在'bower_components'文件夹中安装了jquery。
步骤4:在'angular-cli.json'文件中添加jquery位置
打开“ angular-cli.json”文件(位于“ jquery-demo”文件夹中),然后在“脚本”中添加jquery位置。它看起来像这样:
"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”文件,并为“ p”标签添加jquery变量声明和代码。您还应该使用生命周期挂钩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();
});
});
}
}
现在,使用“ ng serve”命令运行您的angular 2应用并对其进行测试。它应该工作。
$("p").click(function(){ $(this).hide(); });
”什么时候不在 Angular中使用jQuery的最佳示例?
npm install jquery --save
,然后"scripts":["../node_modules/jquery/dist/jquery.js"]
,再import $ from 'jquery';
在* .ts文件。使用凉亭有什么好处?
npm install bower
产生:npm WARN deprecated bower@1.8.0:
(stackoverflow.com/a/31219726/3806701)
您可以实现生命周期挂钩ngAfterViewInit()来添加一些DOM操作
ngAfterViewInit() {
var el:any = elelemtRef.domElement.children[0];
$(el).chosen().on('change', (e, args) => {
_this.selectedValue = args.selected;
});
}
使用router时要小心,因为angular2可能会回收视图..因此,必须确保仅在afterViewInit的第一次调用中才对DOM元素进行操作。(可以使用静态布尔变量来这样做)
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;
}
}
}
Property 'domElement' does not exist on type ElementRef
我用更简单的方式做到了-首先通过npm在控制台中安装jquery: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>
这只会初始化一次全局查询-这对于例如在引导程序中使用模式窗口很重要...
console.log({ conatiner : this.container});
修正它为console.log({ container: this.container});
步骤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'));
}
}
//安装jQuerynpm 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(){}
}
如果您使用angular-cli,则可以执行以下操作:
安装依赖项:
npm install jquery-保存
npm install @ types / jquery --save-dev
导入文件:
在.angular-cli.json文件的“脚本”部分中添加“ ../node_modules/jquery/dist/jquery.min.js”
声明jQuery:
将“ $”添加到tsconfig.app.json的“类型”部分
您可以在官方的Angular CLI文档中找到更多详细信息
在Angular2中使用Jquery(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
}
使用Angular Cli
npm install jquery --save
在angulars.json中的脚本数组
"scripts": [ "node_modules/jquery/dist/jquery.min.js" ] // copy relative path of node_modules>jquery>dist>jquery.min.js to avoid path error
现在要使用jQuery,您所需要做的就是按照以下方式将其导入到要使用jQuery的任何组件中。
例如在根组件中导入和使用jQuery
import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery'; // I faced issue in using jquery's popover
Or
declare var $: any; // declaring jquery in this way solved the problem
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
ngOnInit() {
}
jQueryExampleModal() { // to show a modal with dummyId
$('#dummyId').modal('show');
}
由于我是笨拙的,所以我认为拥有一些有效的代码会很好。
另外,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);
}
}
写就好了
declare var $:any;
在所有导入部分之后,您可以使用jQuery并将jQuery库包含在index.html页面中
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
它对我有用
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)在angular2加载之前,将jquery文件包含在index.html中
<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
}
});
}
}
这项工作对我来说。
我跳过了jquery的安装,因为在我之前创建的所有帖子中都提到了这一点。因此,您已经安装了jquery。像这样将t导入组件
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 as a service vs. import * as $ from'jquery';
我发现的最有效的方法是在页面/组件构造函数内部使用setTimeout并将时间设置为0。这使jQuery在Angular完成加载所有子组件之后的下一个执行周期中运行。可以使用其他一些组件方法,但是在setTimeout中运行时,我尝试过的所有方法均能达到最佳效果。
export class HomePage {
constructor() {
setTimeout(() => {
// run jQuery stuff here
}, 0);
}
}
ngOnInit()
而不是使用
setTimeout
如果您*ngFor
要渲染许多项目,则实际上无法真正工作。
这是对我有用的-带webpack的Angular 2
我尝试声明$
为type,any
但是每当尝试使用任何JQuery模块时(例如),$(..).datepicker()
它都不是一个函数
由于我的vendor.ts文件中包含Jquery,因此我只需使用以下命令将其导入到组件中
import * as $ from 'jquery';
我现在可以使用Jquery插件(例如bootstrap-datetimepicker)
您也可以尝试使用“ InjectionToken”将其导入。如此处所述:在不带类型定义的Angular / Typescript中使用jQuery
您可以简单地注入并使用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();
}
}
全局库安装作为此处的官方文档
从npm安装:
npm install jquery --save
将所需的脚本文件添加到脚本中:
"scripts": [
"node_modules/jquery/dist/jquery.slim.js"
],
如果正在运行,请重新启动服务器,并且该服务器应该可以在您的应用程序上正常工作。
如果要在单个组件import $ from 'jquery';
内部使用,请在组件内部使用
其他人已经发布。但是我在这里举一个简单的例子,这样可以帮助一些新手。
步骤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一起使用
首先,使用npm安装jQuery,如下所示:
npm install jquery — save
其次,转到Angular CLI项目文件夹根目录下的./angular-cli.json文件,找到脚本:[]属性,并包括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");
});
});
}
}
安装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";
使用Angular时,请尽量不要使用jquery库。尝试使用为角度框架生成的功能和库。如果您想使用诸如find(),html(),最近的()等的jquery函数,我建议使用纯js。例如:querySelector(),innerHTML,parentElement等。