如何在Angular 4中使用jQuery插件?


85

我想在角度项目中使用范围滑块,并且尝试使用一个可用模块处理角度4。

它在编译过程中工作正常,但是当我尝试构建它进行部署时,会引发以下错误。

在此处输入图片说明

我检查了直接在Angular项目中使用jQuery插件的选项,而我仅在Angular 2中获得了使用它的选项。

有什么方法可以在Angular 4中使用jQuery插件?

请告诉我。

提前致谢!


1
它包装在一个部件:hackernoon.com/...有从这个角度NG2和NG4之间没有差别。
拉兹万·杜米特鲁

Answers:


160

是的,您可以在Angular 4中使用jquery

脚步:

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等扩展插件?
Tushar

1
解决:npm install jquery &&键入install dt〜jquery --global --save
Johannes


4
@ Jota.Toledo您认为应该怎么做?您是否有其他有关正确方法的信息?
卢卡斯·梅迪纳

3
@ Jota.Toledo您的意思是将其添加到angular-cli.json吗?它似乎真的很实用:)感谢您的建议
Lucas Medina

190

使用npm安装jquery

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
@Grungondoladeclare const $: any;在@ ...装饰器上方添加。
Ervin Llojku '17

这在Angular的zone.js中可以很好地发挥作用吗?
Wolf359

34

使用NPM安装jQuery Jquery NPM

npm install jquery

安装jQuery声明文件

npm install -D @types/jquery

在.ts中导入jQuery

import * as $ from 'jquery';

叫课

export class JqueryComponent implements OnInit {

constructor() {
}

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

}

27

在安装@ types / jquery时,不需要声明任何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

您不应该在Angular中使用jQuery。尽管有可能(请参见其他答案),但不建议这样做。为什么?

Angular在其内存中拥有DOM自己的表示形式,并且不使用document.getElementById(id)jQuery之类的查询选择器(诸如之类的函数)。相反,所有DOM操作都由Renderer2(以及在背景/框架代码中访问该Renderer2的Angular指令,例如* ngFor和* ngIf)完成。如果您自己使用jQuery操作DOM,那么您迟早会...

  1. 遇到同步问题,并在正确的时间从屏幕上出现错误或不消失的情况
  2. 由于Angular的内部DOM表示绑定到zone.js及其更改检测机制,因此在更复杂的组件中会遇到性能问题-因此手动更新DOM总是会阻止您的应用程序在其上运行的线程。
  3. 还有其他您不知道其来源的令人困惑的错误。
  4. 无法正确测试应用程序(Jasmine要求您知道何时呈现元素)
  5. 无法使用Angular Universal或WebWorkers

如果您真的想包括jQuery(用于将您将百分百扔掉的原型原型带走),我建议至少将它包含在package.json中,npm install --save jquery而不是从Google的CDN中获取它。

TLDR:要学习如何以Angular的方式操作DOM,请首先阅读官方的英雄巡回教程: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并更改它的角度。例如$('。js-eachoption [data-id ='+ parentId +']')。closest('。eachLevel')。after(html); 如何做到这一点。
Pradeep '18年

3
在Angular中,@ Pradeep通常不会从html根标签中查找DOM内的元素,尽管这也是可能的(通过在任何组件内引用DOCUMENT或WINDOW)。模块化(用于Angular)是强制您以仅操作父元素中的子元素的方式构建应用程序的。从长远来看,这种分层依赖关系使代码的开发和维护变得更加容易。因此,您应该尝试仅操作当前组件的宿主DOM元素或任何ViewChild或ContentChild及其子元素。
菲尔(Phil)

@Pradeep因此,当您获得对元素(constructor(private renderer: Renderer2, private el: ElementRef) {})的引用时,可以过滤其子元素,也可以通过访问其nativeElement-Property:直接操作该元素ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); }。这是一个如何告诉您更多信息的教程:alligator.io/angular/using-renderer2
Phil,

@Pradeep请记住,renderer2不是您唯一的选择。在Angular中,您可以直接从模板中操作DOM。例如,当前组件的模板中的DOM元素可以很容易地处理*ngIf*ngFor定制指令,管道和CSS(由您)ngClass[style.background][class.myCustomCssClass]。如需更多帮助,请访问:angular.io/tutorial/toh-pt2
Phil

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声明文件),这些tds都很简单,并且具有方法,类型,函数等信息, 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

尝试使用-声明let $:any;

或从'jquery / dist / jquery.min.js'导入*作为$; 提供lib的确切路径


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>

第三步:在* .component.ts中你想使用jQuery的地方

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

然后,您可以使用与javaScript相同的jquery。这样,VScode支持通过Typescript自动建议


-3
ngOnInit() {
     const $ = window["$"];
     $('.flexslider').flexslider({
        animation: 'slide',
        start: function (slider) {
          $('body').removeClass('loading')
        }
     })
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.