Angular 4 ile jQuery Eklentisi nasıl kullanılır?


85

Açısal bir projede bir aralık kaydırıcısı kullanmak istiyorum ve açısal 4 için mevcut bir modülü kullanmayı denedim.

Derleme sırasında iyi çalışıyor ancak dağıtım için oluşturmaya çalıştığımda aşağıdaki hatayı atıyor.

görüntü açıklamasını buraya girin

JQuery eklentisini doğrudan açısal projede kullanma seçeneğini kontrol ettim ve yalnızca bunu Angular 2'de yapmak için seçenekler alıyorum.

Angular 4'te jQuery eklentilerini kullanmanın bir yolu var mı?

Lütfen bana haber ver.

Şimdiden teşekkürler!


1
Bir bileşene sarın: hackernoon.com/… Bu açıdan ng2 ve ng4 arasında bir fark yoktur.
Razvan Dumitru

Yanıtlar:


160

Evet, Angular 4 ile jquery kullanabilirsiniz

Adımlar:

1) index.htmlEtikette aşağıdaki satıra girilir.

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

2) Aşağıdaki bileşen ts dosyasında, böyle bir var bildirmelisiniz

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

}

Ve bu kodu aşağıdaki gibi karşılık gelen html dosyası için kullanın:

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

Bu senin için çalışacak. Teşekkürler


1
İşe yaradı!! Jquery-ui gibi genişletilmiş eklentileri nasıl kullanırsınız?
Tushar

1
çözüldü: npm jquery && typings yükle dt ~ jquery yükle --global --save
Johannes


4
@ Jota.Toledo nasıl yapılması gerektiğini düşünürdünüz? Bunu yapmanın doğru yolu hakkında ek bilginiz var mı?
mluke

3
@ Jota.Toledo, onu angular-cli.json'a eklemek mi istiyorsunuz? Gerçekten pratik görünüyor :) tavsiye için teşekkürler
mluke

190

Jquery'yi npm ile yükleyin

npm install jquery --save

Yazı ekle

npm install --save-dev @types/jquery

Angular-cli.json'a komut dosyaları ekleyin

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

Proje oluşturun ve sunun

ng build

Bu yardımcı olur umarım! Kodlamanın tadını çıkarın


11
Ayrıca add declare var jquery:any; declare var $ :any;.ts dosyanızı da unutmayın .

19
@Norx talimatlar türleri yüklemeyi içerir, bu da hatlarınıza ihtiyaç duyulmadığı anlamına gelir.
salbahra

5
Bunu yaptığımda yapı hataları alıyorum. Cannot find name '$'
Türlerle

1
@Grungondola declare const $: any;@ ... dekoratörün üstüne ekleyin .
Ervin Llojku

Bu, Angular'ın zone.js ile iyi oynuyor mu?
Wolf359

34

JQuery'yi NPM Jquery NPM kullanarak kurun

npm install jquery

JQuery bildirim dosyasını yükleyin

npm install -D @types/jquery

JQuery'yi .ts içine içe aktarın

import * as $ from 'jquery';

sınıftan ara

export class JqueryComponent implements OnInit {

constructor() {
}

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

}

27

@ Types / jquery'yi yüklerken herhangi bir jQuery değişkenini bildirmeniz gerekmez.

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

Her yerde jQuery'ye erişiminiz olmalıdır.

Aşağıdakiler çalışmalıdır:

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

1
Cannot find name 'jQuery'Bunları .tsdosyada beyan etmiyorsam bu hatayı alıyorum . Öyleyse, bu sorunla karşı karşıya kalan biri varsa, bunu beyan etmesi gerekiyor.
Amr

Geçmişte TS derleyicisinin şikayet etmemesini sağlamak için belirtilen ithalat bildirimlerinin gerekli olduğu sorunlar yaşadım. Ancak, yakın zamanda paketlerimi güncelledim ve şimdi bu içe aktarma ifadeleri 3. taraf eklentilerimin tanımlanmamasına neden oluyor. İşte mevcut yapılandırmam: Açısal sürüm: 4.4.7 @ angular / cli @ 1.7.4 jquery@3.3.1 typescript@2.3.4
nthaxis

13

Angular'da jQuery kullanmamalısınız. Mümkün olsa da (bu soru için diğer cevaplara bakın), cesareti kırılmıştır. Neden?

Angular, belleğinde DOM'un kendi temsilini tutar ve document.getElementById(id)jQuery gibi sorgu seçicileri (benzeri işlevler ) kullanmaz . Bunun yerine, tüm DOM manipülasyonu Renderer2 (ve arka planda / çerçeve kodunda bu Renderer2'ye erişen * ngFor ve * ngIf gibi Angular yönergeleri) tarafından yapılır. DOM'u jQuery ile kendiniz değiştirirseniz, er ya da geç ...

  1. Senkronizasyon sorunları yaşayın ve ekranınızdan doğru zamanda yanlış görünen veya kaybolmayan şeyler var
  2. Angular'ın dahili DOM temsili zone.js ve değişiklik algılama mekanizmasına bağlı olduğundan, daha karmaşık bileşenlerde performans sorunları yaşayın - bu nedenle DOM'u manuel olarak güncellemek, uygulamanızın üzerinde çalıştığı iş parçacığını her zaman engeller.
  3. Kaynağını bilmediğiniz kafa karıştırıcı başka hatalar varsa.
  4. Uygulamayı doğru bir şekilde test edememe (Jasmine, öğelerin ne zaman işlendiğini bilmenizi ister)
  5. Angular Universal veya WebWorkers'ı kullanamama

Gerçekten jQuery'yi dahil etmek istiyorsanız (% 100 kesin olarak atacağınız bazı prototipleri kaydetmek için), npm install --save jquerygoogle CDN'den almak yerine en azından package.json'a eklemenizi öneririm .

TLDR: DOM'u Angular yolla nasıl işleyeceğinizi öğrenmek için lütfen önce resmi kahramanlar turu eğitimine göz atın: https://angular.io/tutorial/toh-pt2 DOM hiyerarşisinde daha üstteki öğelere erişmeniz gerekiyorsa (ebeveyn veya document body) ya da direktifler gibi başka bir nedenden dolayı *ngIf, *ngForözel direktifler, boru ve benzeri diğer açısal yardımcı programları [style.background], [class.myOwnCustomClass] ihtiyaçlarını karşılamak değil, kullanım Renderer2: https://www.concretepage.com/angular-2/angular-4 -renderer2-example


Demek istediğini anlıyorum. Ancak DOM'a nasıl erişilir ve onu açısal olarak nasıl değiştirilir. Örneğin $ ('. Js-eachoption [data-id =' + parentId + ']'). Near ('. EachLevel']. After (html); Bunu sadece açısal ile nasıl yapılır.
Pradeep

3
@Pradeep Angular'da genellikle DOM içindeki öğeleri kök html etiketinden aramaya başlamazsınız, ancak bu da mümkündür (herhangi bir bileşenin içindeki DOCUMENT veya WINDOW'a başvurarak). Modülerleştirme (Angular için yapılmıştır) sizi, uygulamanızı yalnızca ana öğelerdeki alt öğeleri işleyeceğiniz şekilde oluşturmaya zorlar. Uzun vadede böyle bir hiyerarşik bağımlılık, kodun geliştirilmesini ve sürdürülmesini çok daha kolay hale getirir. Bu nedenle, yalnızca geçerli bileşenin ana DOM öğesini veya herhangi bir ViewChild veya ContentChild ve bunların alt öğelerini değiştirmeye çalışmalısınız.
Phil

@Pradeep Yani bir elemanın (bir başvuru olsun constructor(private renderer: Renderer2, private el: ElementRef) {}), ya da çocuklar için filtre veya 's nativeElement-Mülkiyet erişerek doğrudan eleman manipüle edilebilir: ngOnInit() { this.renderer.addClass(this.el.nativeElement, 'wild'); }. İşte size daha fazlasını anlatmak için bir öğretici: alligator.io/angular/using-renderer2
Phil

@Pradeep lütfen renderer2'nin tek seçeneğiniz olmadığını unutmayın. Angular'da DOM'u doğrudan şablondan değiştirebilirsiniz. Örneğin, geçerli bileşenin şablonu içinde DOM elemanları kolayca ele alınabilir *ngIf, *ngFor, direktifleri, borular ve CSS için (eğer tarafından yapılan) özel ngClass, [style.background]ve [class.myCustomCssClass]. Daha fazla yardım için: angular.io/tutorial/toh-pt2
Phil

8

Bunu dene:

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

Veya angular-cli.json'a komut dosyaları ekleyin:

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

ve .ts dosyanızda:

declare var $: any;

1

Jquery yazma sürümünüzü şu şekilde güncelleyebilirsiniz:

npm install --save @types/jquery@latest

Aynı hatayı yaşadım ve 5 gün boyunca bir çözüm için internette geziniyordum. Benim için çalıştı ve senin için çalışmalı


1

Sadece projelerde değil, projelerde --typescript - diğer kitaplıkları kullanmanız gerekiyorsa, depares olan ve yöntem, tür, işlev vb. Bilgileri içeren tds'leri (TypeScript Bildirimi Dosyası) arayabilirsiniz. TypeScript tarafından, genellikle içe aktarmaya gerek kalmadan kullanılabilir. var bildirmek son kaynaktır

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

1

Bunu sağlamak için web paketini kullanabilirsiniz . Daha sonra DOM otomatik olarak enjekte edilecektir.

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

Kullanmayı deneyin - let $: any;

veya * 'jquery / dist / jquery.min.js'den $ olarak içe aktarın; kitaplığın tam yolunu sağlayın


0

dizginin çözümü:

Aşama 1:

npm install jquery

npm install --save-dev @types/jquery

step2: Angular.json'da şunu ekleyin:

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

veya index.html'de şunu ekleyin:

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

step3 : jquery kullanmak istediğiniz yerde * .component.ts içinde

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

Daha sonra jquery'yi javaScript ile aynı şekilde kullanabilirsiniz. Bu şekilde, VScode, Typescript ile otomatik öneriyi destekler


-3
ngOnInit() {
     const $ = window["$"];
     $('.flexslider').flexslider({
        animation: 'slide',
        start: function (slider) {
          $('body').removeClass('loading')
        }
     })
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.