Cách sử dụng jQuery Plugin với Angular 4?


85

Tôi muốn sử dụng thanh trượt phạm vi trong một dự án góc cạnh và tôi đã thử sử dụng một mô-đun có sẵn cho góc 4.

Nó hoạt động tốt trong quá trình biên dịch nhưng khi tôi cố gắng xây dựng nó để triển khai, nó phát ra lỗi bên dưới.

nhập mô tả hình ảnh ở đây

Tôi đã kiểm tra tùy chọn sử dụng plugin jQuery trực tiếp trong dự án góc và tôi chỉ nhận được tùy chọn để thực hiện nó trong Angular 2.

Có cách nào chúng ta có thể sử dụng các plugin jQuery trong Angular 4 không?

Làm ơn cho tôi biết.

Cảm ơn trước!


1
Gói nó trong một thành phần: hackernoon.com/… Không có sự khác biệt giữa ng2 và ng4 từ quan điểm này.
Razvan Dumitru

Câu trả lời:


160

Có, bạn có thể sử dụng jquery với Angular 4

Các bước:

1) Trong index.htmlthẻ dòng bên dưới.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

2) Trong tệp component ts bên dưới, bạn phải khai báo var như thế này

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(); //
  }

}

Và sử dụng mã này cho tệp html tương ứng như sau:

<h1 class="title" style="display:none">
  {{title}}
</h1>
<button (click)="toggleTitle()"> clickhere</button>

Điều này sẽ làm việc cho bạn. Cảm ơn


1
Nó đã làm việc!! Bạn sẽ sử dụng các plugin mở rộng như jquery-ui như thế nào?
Tushar

1
đã giải quyết: npm install jquery && typings install dt ~ jquery --global --save
Johannes

@ Johannes Tham khảo tài liệu nguyên cảo cho typings typescriptlang.org/docs/handbook/declaration-files/... , microsoft.github.io/TypeSearch
Ervin Llojku

4
@ Jota.Toledo bạn nghĩ nó nên được thực hiện như thế nào? Bạn có bất kỳ thông tin bổ sung nào về cách phù hợp để làm điều đó không?
Lucas Medina

3
@ Jota.Toledo ý bạn là thêm nó vào angle-cli.json? Có vẻ như thực sự thiết thực :) cảm ơn cho lời khuyên
Lucas Medina

190

Cài đặt jquery với npm

npm install jquery --save

Thêm kiểu chữ

npm install --save-dev @types/jquery

Thêm tập lệnh vào angle-cli.json

"apps": [{
  ...
  "scripts": [
    "../node_modules/jquery/dist/jquery.min.js",
  ],
  ...
}]

Xây dựng dự án và phục vụ

ng build

Hi vọng điêu nay co ich! Thích viết mã


11
Cũng đừng quên đến add declare var jquery:any; declare var $ :any;tệp .ts của bạn.

19
@Norx các hướng dẫn bao gồm cài đặt các loại có nghĩa là dòng của bạn không cần thiết.
salbahra

5
Tôi nhận được lỗi xây dựng khi tôi làm điều này. Tôi có jquery 3.2.1 được cài đặt với các loại, vì vậy nó không cho tôi lỗi trong mã, nhưng tôi vẫn nhận xây dựng các lỗi nêu:Cannot find name '$'
Grungondola

1
@Grungondola thêm declare const $: any;phía trên trình trang trí @ ....
Ervin Llojku

Điều này có hoạt động tốt với Zone.js của Angular không?
Wolf359

34

Cài đặt jQuery bằng NPM Jquery NPM

npm install jquery

Cài đặt tệp khai báo jQuery

npm install -D @types/jquery

Nhập jQuery bên trong .ts

import * as $ from 'jquery';

gọi vào trong lớp

export class JqueryComponent implements OnInit {

constructor() {
}

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

}

27

Bạn không bắt buộc phải khai báo bất kỳ biến jQuery nào khi bạn đã cài đặt @ type / jquery.

declare var jquery:any;   // not required
declare var $ :any;   // not required

Bạn nên có quyền truy cập vào jQuery ở mọi nơi.

Những điều sau sẽ hoạt động:

jQuery('.title').slideToggle();

1
Tôi gặp lỗi này Cannot find name 'jQuery'nếu tôi không khai báo chúng trong .tstệp. Vì vậy, nếu bất cứ ai gặp phải vấn đề này, anh ta chỉ cần khai báo chúng.
Sáng

Trước đây, tôi đã gặp vấn đề trong đó các câu lệnh nhập được đề cập WERE cần thiết để trình biên dịch TS không phàn nàn. Tuy nhiên, gần đây tôi đã cập nhật các gói của mình và bây giờ các câu lệnh nhập đó khiến các plugin bên thứ 3 của tôi không được xác định. Đây là cấu hình hiện tại của tôi: Phiên bản Angular: 4.4.7 @ angle / cli @ 1.7.4 jquery@3.3.1 stylescript@2.3.4
nthaxis

13

Bạn không nên sử dụng jQuery trong Angular. Mặc dù có thể (xem các câu trả lời khác cho câu hỏi này), nhưng nó không được khuyến khích. Tại sao?

Angular giữ một bản đại diện riêng của DOM trong bộ nhớ của nó và không sử dụng các bộ chọn truy vấn (các chức năng như document.getElementById(id)) như jQuery. Thay vào đó, tất cả thao tác DOM được thực hiện bởi Renderer2 (và các chỉ thị Angular như * ngFor và * ngNếu truy cập vào Renderer2 đó trong background / framework-code). Nếu bạn tự mình thao tác DOM với jQuery thì sớm muộn gì bạn cũng sẽ ...

  1. Gặp phải sự cố đồng bộ hóa và có những thứ xuất hiện sai hoặc không biến mất vào đúng thời điểm khỏi màn hình của bạn
  2. Gặp vấn đề về hiệu suất trong các thành phần phức tạp hơn, vì biểu diễn DOM nội bộ của Angular bị ràng buộc với zone.js và cơ chế phát hiện thay đổi của nó - vì vậy việc cập nhật DOM theo cách thủ công sẽ luôn chặn luồng ứng dụng của bạn đang chạy.
  3. Mắc các lỗi khó hiểu khác mà bạn không rõ nguồn gốc.
  4. Không thể kiểm tra ứng dụng một cách chính xác (Jasmine yêu cầu bạn biết khi nào các phần tử đã được hiển thị)
  5. Không thể sử dụng Angular Universal hoặc WebWorkers

Nếu bạn thực sự muốn bao gồm jQuery (để khai thác một số nguyên mẫu mà bạn chắc chắn sẽ vứt bỏ 100%), tôi khuyên bạn nên đưa nó vào package.json của mình npm install --save jquerythay vì lấy nó từ CDN của google.

TLDR: Để tìm hiểu cách thao tác DOM theo cách Angular, trước tiên hãy xem hướng dẫn tham quan chính thức về các anh hùng: https://angular.io/tutorial/toh-pt2 Nếu bạn cần truy cập các phần tử cao hơn trong hệ thống phân cấp DOM (cha hoặc document body) hoặc vì một số lý do khác như lệnh *ngIf, lệnh *ngFortùy chỉnh, đường ống và các tiện ích góc cạnh khác như [style.background], [class.myOwnCustomClass] không đáp ứng nhu cầu của bạn, hãy sử dụng Renderer2: https://www.concretepage.com/angular-2/angular-4 -renderer2-ví dụ


Tôi hiểu ý bạn. Nhưng làm thế nào để truy cập DOM và thay đổi nó theo góc cạnh. Ví dụ: $ ('. Js-eachoption [data-id =' + parentId + ']'). Near ('. EachLevel'). After (html); Làm thế nào để làm điều này với chỉ góc.
Pradeep

3
@Pradeep trong Angular, bạn thường không bắt đầu tìm kiếm các phần tử bên trong DOM từ thẻ html gốc, mặc dù điều đó cũng có thể xảy ra (bằng cách tham chiếu DOCUMENT hoặc WINDOW bên trong bất kỳ thành phần nào). Mô-đun hóa (mà Angular được tạo ra) buộc bạn phải xây dựng ứng dụng của mình theo cách mà bạn chỉ thao tác các phần tử con từ các phần tử mẹ. Về lâu dài, sự phụ thuộc phân cấp như vậy làm cho việc phát triển và bảo trì mã dễ dàng hơn nhiều. Vì vậy, bạn nên cố gắng chỉ thao tác phần tử DOM máy chủ của thành phần hiện tại hoặc bất kỳ ViewChild hoặc ContentChild nào và con của chúng.
Phil

@Pradeep Vì vậy, khi bạn nhận được một tham chiếu đến một phần tử ( constructor(private renderer: Renderer2, private el: ElementRef) {}), bạn có thể lọc các phần tử con của nó hoặc thao tác trực tiếp phần tử đó bằng cách truy cập nativeElement-Property : ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); }. Đây là hướng dẫn cách cho bạn biết thêm: alligator.io/angular/using-renderer2
Phil

@Pradeep xin lưu ý rằng render2 không phải là lựa chọn duy nhất của bạn. Trong Angular, bạn có thể thao tác trực tiếp với DOM từ mẫu. Ví dụ, phần tử DOM bên trong mẫu thành phần hiện tại của một cách dễ dàng có thể được xử lý với *ngIf, *ngFor, tùy chỉnh (do bạn) chỉ thị, đường ống và cho CSS ngClass, [style.background][class.myCustomCssClass]. Để được trợ giúp thêm: angle.io/tutorial/toh-pt2
Phil

8

Thử đi:

import * as $ from 'jquery/dist/jquery.min.js';

Hoặc thêm các tập lệnh vào angle-cli.json:

"scripts": [
    "../node_modules/jquery/dist/jquery.min.js",
  ]

và trong tệp .ts của bạn:

declare var $: any;

1

Bạn có thể cập nhật phiên bản jquery typings của mình như vậy

npm install --save @types/jquery@latest

Tôi đã gặp lỗi tương tự và tôi đã ở nếu trong 5 ngày lướt mạng để tìm giải pháp. Nó hoạt động với tôi và nó sẽ hoạt động với bạn


1

Nếu bạn có nhu cầu sử dụng các thư viện khác trong các dự án --typescript - không chỉ trong các dự án - angle - bạn có thể tìm kiếm tds (Tệp khai báo TypeScript) được mô tả và có thông tin về các phương thức, kiểu, hàm, v.v., có thể được sử dụng bởi TypeScript, thường không cần nhập. khai báo var là tài nguyên cuối cùng

npm install @types/lib-name --save-dev

1

Bạn có thể sử dụng webpack để cung cấp nó. Sau đó nó sẽ được đưa vào DOM tự động.

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

Hãy thử sử dụng - khai báo let $: any;

hoặc nhập * dưới dạng $ từ 'jquery / dist / jquery.min.js'; cung cấp đường dẫn chính xác của lib


0

giải pháp cho bảng chữ:

Bước 1:

npm install jquery

npm install --save-dev @types/jquery

step2: trong Angular.json thêm:

"scripts": [
        "node_modules/jquery/dist/jquery.min.js",
      ]

hoặc trong index.html thêm:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

step3: trong * .component.ts nơi bạn muốn sử dụng jquery

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

Sau đó, bạn có thể sử dụng jquery giống như javaScript. Bằng cách này, VScode hỗ trợ tự động đề xuất bằng Typecript


-3
ngOnInit() {
     const $ = window["$"];
     $('.flexslider').flexslider({
        animation: 'slide',
        start: function (slider) {
          $('body').removeClass('loading')
        }
     })
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.