จะใช้ jQuery Plugin กับ Angular 4 ได้อย่างไร?


85

ฉันต้องการใช้แถบเลื่อนช่วงในโครงการเชิงมุมและฉันลองใช้โมดูลที่มีอยู่หนึ่งโมดูลสำหรับเชิงมุม 4

มันใช้งานได้ดีในระหว่างการคอมไพล์ แต่เมื่อฉันพยายามสร้างเพื่อปรับใช้มันแสดงข้อผิดพลาดด้านล่าง

ใส่คำอธิบายภาพที่นี่

ฉันตรวจสอบตัวเลือกในการใช้ปลั๊กอิน jQuery โดยตรงในโครงการเชิงมุมและฉันได้รับตัวเลือกสำหรับทำใน Angular 2 เท่านั้น

มีวิธีใดบ้างที่เราสามารถใช้ปลั๊กอิน jQuery ใน Angular 4 ได้?

กรุณาแจ้งให้เราทราบ

ขอบคุณล่วงหน้า!


1
รวมไว้ในส่วนประกอบ: hackernoon.com/…ไม่มีความแตกต่างระหว่าง ng2 และ ng4 จากมุมมองนี้
Razvan Dumitru

คำตอบ:


160

ใช่คุณสามารถใช้ jquery กับ Angular 4 ได้

ขั้นตอน:

1) index.htmlใส่บรรทัดด้านล่างในแท็ก

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

2) ในไฟล์ component 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 ติดตั้ง jquery && typings ติดตั้ง dt ~ jquery --global --save
Johannes

@Johannes อ้างถึงเอกสาร typescript สำหรับการพิมพ์typescriptlang.org/docs/handbook/declaration-files/… , microsoft.github.io/TypeSearch
Ervin Llojku

4
@ Jota Toledo คุณคิดว่าควรทำอย่างไร? คุณมีข้อมูลเพิ่มเติมเกี่ยวกับวิธีการที่ถูกต้องหรือไม่?
mluke

3
@ Jota Toledo คุณหมายถึงเพิ่มลงใน angular-cli.json? ดูเหมือนใช้ได้จริง :) ขอบคุณสำหรับคำแนะนำ
mluke

190

ติดตั้ง jquery ด้วย npm

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
@Grungondola เพิ่มdeclare const $: any;ข้างบน @ ... มัณฑนากร.
Ervin Llojku

สิ่งนี้เล่นได้ดีกับ zone.js ของ Angular หรือไม่
Wolf359

34

ติดตั้ง jQuery โดยใช้ NPM Jquery NPM

npm install jquery

ติดตั้งไฟล์ประกาศ jQuery

npm install -D @types/jquery

นำเข้า jQuery ภายใน. ts

import * as $ from 'jquery';

โทรภายในชั้นเรียน

export class JqueryComponent implements OnInit {

constructor() {
}

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

}

27

คุณไม่จำเป็นต้องประกาศตัวแปร jQuery ใด ๆ เมื่อคุณติดตั้ง @ types / jquery

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

คุณควรเข้าถึง jQuery ได้ทุกที่

สิ่งต่อไปนี้ควรใช้งานได้:

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

1
ฉันได้รับข้อผิดพลาดนี้Cannot find name 'jQuery'หากฉันไม่ได้ประกาศไว้ใน.tsไฟล์ ดังนั้นหากใครประสบปัญหานี้เขาก็ต้องแจ้งให้ทราบ
Amr

ฉันเคยมีปัญหาในอดีตที่คำสั่งนำเข้าดังกล่าวจำเป็นเพื่อให้คอมไพเลอร์ TS ไม่บ่น อย่างไรก็ตามฉันเพิ่งอัปเดตแพ็คเกจของฉันและตอนนี้คำสั่งนำเข้าเหล่านั้นทำให้ปลั๊กอินของบุคคลที่สามของฉันไม่ได้รับการกำหนด นี่คือการกำหนดค่าปัจจุบันของฉัน: เวอร์ชันเชิงมุม: 4.4.7 @ angular / cli @ 1.7.4 jquery@3.3.1 typescript@2.3.4
nthaxis

13

คุณไม่ควรใช้ jQuery ใน Angular แม้ว่าจะเป็นไปได้ (ดูคำตอบอื่น ๆ สำหรับคำถามนี้) แต่ก็ท้อใจ ทำไม?

Angular มีการเป็นตัวแทนของ DOM ในหน่วยความจำของตัวเองและไม่ใช้ตัวเลือกแบบสอบถาม (ฟังก์ชั่นเช่นdocument.getElementById(id)) เช่น jQuery แต่การจัดการ DOM ทั้งหมดจะทำโดย Renderer2 (และ Angular-directives เช่น * ngFor และ * ngIf เข้าถึง Renderer2 นั้นในพื้นหลัง / framework-code) หากคุณจัดการ DOM ด้วย jQuery ด้วยตัวคุณเองไม่ช้าก็เร็ว ...

  1. พบปัญหาการซิงโครไนซ์และมีสิ่งผิดปกติปรากฏขึ้นหรือไม่หายไปในเวลาที่เหมาะสมจากหน้าจอของคุณ
  2. มีปัญหาด้านประสิทธิภาพในส่วนประกอบที่ซับซ้อนมากขึ้นเนื่องจากการแสดง DOM ภายในของ Angular ถูกผูกไว้กับ zone.js และกลไกการตรวจจับการเปลี่ยนแปลงดังนั้นการอัปเดต DOM ด้วยตนเองจะบล็อกเธรดที่แอปของคุณทำงานอยู่เสมอ
  3. มีข้อผิดพลาดที่น่าสับสนอื่น ๆ ที่คุณไม่ทราบที่มาของ
  4. ไม่สามารถทดสอบแอปพลิเคชันได้อย่างถูกต้อง (จัสมินต้องการให้คุณทราบเมื่อแสดงผลองค์ประกอบแล้ว)
  5. ไม่สามารถใช้ Angular Universal หรือ WebWorkers ได้

หากคุณต้องการรวม jQuery จริงๆ (สำหรับการแตะต้นแบบบางอย่างที่คุณจะทิ้ง 100% อย่างแน่นอน) ฉันขอแนะนำให้รวมไว้ใน package.json ของคุณด้วยnpm install --save jqueryแทนที่จะรับจาก CDN ของ Google

TLDR: สำหรับการเรียนรู้วิธีจัดการ 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 ตัวอย่าง


ฉันเข้าใจคุณชี้ แต่จะเข้าถึง DOM และเปลี่ยนเป็นเชิงมุมได้อย่างไร เช่น $ ('. js-eachoption [data-id =' + parentId + ']'). closest ('. eachLevel'). after (html); วิธีทำแบบเชิงมุม
ประทีป

3
@Pradeep ใน Angular คุณมักจะไม่เริ่มค้นหาองค์ประกอบภายใน DOM จาก root html-tag แม้ว่าจะเป็นไปได้ก็ตาม (โดยการอ้างอิง DOCUMENT หรือ WINDOW ภายในส่วนประกอบใด ๆ ก็ตาม) Modularization (ซึ่ง Angular ถูกสร้างขึ้นมาเพื่อ) บังคับให้คุณสร้างแอปด้วยวิธีที่คุณจัดการเฉพาะองค์ประกอบลูกจากองค์ประกอบหลัก ในระยะยาวการพึ่งพาตามลำดับชั้นดังกล่าวทำให้การพัฒนาและการบำรุงรักษาโค้ดง่ายขึ้นมาก ดังนั้นคุณควรพยายามจัดการเฉพาะองค์ประกอบ DOM โฮสต์ขององค์ประกอบปัจจุบันหรือ ViewChild หรือ ContentChild และลูก ๆ
ฟิลิป

@Pradeep ดังนั้นเมื่อคุณได้รับการอ้างอิงถึงองค์ประกอบ ( constructor(private renderer: Renderer2, private el: ElementRef) {}), คุณกรองทั้งสำหรับเด็กหรือสามารถจัดการองค์ประกอบโดยตรงโดยการเข้าถึงมัน ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); }nativeElement-อสังหาริมทรัพย์: นี่คือบทช่วยสอนที่จะบอกคุณได้มากขึ้น: 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 - ไม่ใช่แค่ในโปรเจ็กต์ - มุมมอง - คุณสามารถค้นหา tds (ไฟล์ประกาศ TypeScript) ที่มีการเปรียบเทียบและมีข้อมูลของวิธีการประเภทฟังก์ชัน ฯลฯ ซึ่ง 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

การแก้ปัญหา typescript:

ขั้นตอนที่ 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>

ขั้นตอนที่ 3:ใน * .component.ts ที่คุณต้องการใช้ jquery

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

จากนั้นคุณสามารถใช้ jquery เหมือนกับ javaScript ด้วยวิธีนี้ VScode สนับสนุนคำแนะนำอัตโนมัติโดย typescript


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.