Angular 4에서 jQuery 플러그인을 사용하는 방법은 무엇입니까?


85

각도 프로젝트에서 범위 슬라이더를 사용하고 싶은데 각도 4에 사용 가능한 모듈 하나를 사용해 보았습니다.

컴파일하는 동안 잘 작동하지만 배포를 위해 빌드하려고하면 아래 오류가 발생합니다.

여기에 이미지 설명 입력

Angular 프로젝트에서 직접 jQuery 플러그인을 사용하는 옵션을 확인했고 Angular 2에서만 옵션을 얻었습니다.

Angular 4에서 jQuery 플러그인을 사용할 수있는 방법이 있습니까?

알려주세요.

미리 감사드립니다!


1
구성 요소로 감싸십시오 : hackernoon.com/… 이 관점에서 ng2와 ng4 사이에는 차이가 없습니다.
Razvan Dumitru

답변:


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
해결 : JQuery와 && typings를 설치 NPM 설치 DT ~ JQuery와 --global --save
요하네스


4
@ Jota.Toledo 어떻게해야할까요? 올바른 방법에 대한 추가 정보가 있습니까?
mluke

3
@ Jota.Toledo angular-cli.json에 추가한다는 뜻입니까? 정말 실용적인 것 같습니다 :) 조언을 주셔서 감사합니다
mluke

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
@Grungondola declare const $: any;는 @ ... 데코레이터 위에 추가 합니다.
Ervin Llojku

Angular의 zone.js와 잘 작동합니까?
Wolf359

34

NPM Jquery NPM을 사용하여 jQuery 설치

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

나는 과거에 언급 된 import 문이 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 (및 * ngFor 및 * ngIf와 같은 Angular 지시문이 백그라운드 / 프레임 워크 코드에서 해당 Renderer2에 액세스)에 의해 수행됩니다. jQuery로 DOM을 직접 조작한다면 조만간 ...

  1. 동기화 문제가 발생하고 화면에서 적절한 시간에 항목이 잘못 표시되거나 사라지지 않습니다.
  2. Angular의 내부 DOM 표현이 zone.js 및 변경 감지 메커니즘에 바인딩되어 있기 때문에 더 복잡한 구성 요소에서 성능 문제가 있습니다. 따라서 DOM을 수동으로 업데이트하면 앱이 실행되는 스레드가 항상 차단됩니다.
  3. 원인을 모르는 다른 혼란스러운 오류가 있습니다.
  4. 애플리케이션을 올바르게 테스트 할 수 없음 (Jasmine에서는 요소가 렌더링 된시기를 알아야 함)
  5. Angular Universal 또는 WebWorkers를 사용할 수 없음

정말로 jQuery를 포함하고 싶다면 (100 % 확실하게 버릴 프로토 타입을 덕 테이핑하기 위해), 적어도 npm install --save jqueryGoogle의 CDN에서 가져 오는 대신 package.json에 포함하는 것이 좋습니다 .

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- 예제


나는 당신이 지적하는 것을 이해합니다. 그러나 DOM에 액세스하고 각도를 변경하는 방법. 예를 들어 $ ( '. js-eachoption [data-id ='+ parentId + ']'). closest ( '. eachLevel'). after (html); 각도만으로 이것을 수행하는 방법.
Pradeep

3
Angular의 @Pradeep은 일반적으로 루트 html 태그에서 DOM 내부의 요소를 찾기 시작하지 않습니다. 모듈화 (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 선언 파일)를 찾을 수 있습니다., 일반적으로 가져올 필요없이 TypeScript에서 사용할 수 있습니다. var가 마지막 자원임을 선언하십시오.

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

1

웹팩을 사용하여 제공 할 수 있습니다 . 그런 다음 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

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 단계 : jquery를 사용하려는 * .component.ts

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')
        }
     })
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.