Как использовать JQuery с Javascript в Angular 2

    import {Component, ElementRef, OnInit} from 'angular2/core';
    declare var jQuery:any;
    @Component({
      selector: 'jquery-integration',
      templateUrl: './components/jquery-integration/jquery-integration.html'
    })
    export class JqueryIntegration implements OnInit {
      elementRef: ElementRef;
      constructor(elementRef: ElementRef) {
        this.elementRef = elementRef;
      }
      ngOnInit() {
        jQuery(this.elementRef.nativeElement).draggable({
        containment:'#draggable-parent'
      });
    }
  }

Можно ли использовать jQuery с TypeScript в Angular2, как описано выше? Как мне использовать jQuery с JavaScript в Angular2?

6 ответов

По моему мнению: если вы делаете это правильно, и если вы делаете это минимальным, вы должны пойти на это.

  1. Установите jQuery Typings в проекте: tsd установите jQuery
  2. Загрузите jQuery с тегом script (или другими загрузчиками...)
  3. Оберните любой плагин jQuery директивой Angular 2

Пример:

@Directive({
  selector: "[sm-dropdown]"
})
export class SMDropdown {
  constructor(el: ElementRef) {
    jQuery(el.nativeElement).dropdown();
  }
}

Рассмотрим этот Плункер:

https://plnkr.co/edit/MMNWGh?p=preview

Не рекомендуется :

  • Не используйте его для манипуляций с DOM, есть угловой способ...
  • Не используйте его для звонков AJAX, есть угловой способ...
  • Не используйте его для анимации, ngAnimation приходит...

Когда у вас установлена ​​библиотека машинописи JQuery, сделайте ссылку на нее следующим образом

///<reference path="../typings/jquery/jquery.d.ts" />

Затем сделайте необходимый импорт

import {Component, AfterViewInit} from 'angular2/core';

Теперь напишите класс

@Component({
  selector: 'my-app',
  templateUrl: 'app/html/app.component.html'
})

export class AppComponent implements AfterViewInit {
  ngAfterViewInit() {
    // Your jQuery code goes here
    $('#here').text("HALLO! ^_^");
  }
}

Что я делаю, чтобы решить эту проблему:

Для библиотеки не поддерживает @types/ и библиотека должна загружаться при загрузке документа (значит, библиотеки нужно добавить в тег скрипта документа)

  1. Бежать npm install jquery --save
  2. Добавить JS / CSS файлы в scripts или же styles из angular-cli.json лайк

    "scripts": ["../node_modules/path to file", "./assets/path to file"]

Для библиотеки поддерживается @types/, просто беги npm install @types/jquery --save-dev

Чтобы использовать библиотеку, добавьте declare var jQuery: any; до аннотации @Directive или же @Component хочу использовать библиотеку

P/S: я использую angular-cli с webpack в моем проекте, возможно, отличается от systemjs

Вы должны указать, где можно найти определение jQuery typeScript. Это можно сделать в файле typings.d.ts, в который вы помещаете ваши печатные тексты следующим образом:

///<reference path="../typings/jquery/jquery.d.ts" />

Или вы можете установить наборы через узел и позволить вашей конфигурации загрузить его автоматически. Это то, что делают angular-cli.

После этого, чтобы использовать jQuery с Angular2, вы должны понимать механизм fondamental. Angular2 имеет свое собственное представление dom, и jQuery управляет этим dom. Вот почему люди говорят: "Не используйте jQuery с Angular2". Это не правильно. Angular2 поставляется с решением этой проблемы. Он называет это ControlValueAccessor. Цель этого - предупредить angular, когда ваш плагин jQuery изменяет DOM, а также позволить angular уведомлять ваш плагин, когда он тоже модифицирует DOM.

Позвольте мне объяснить это на примере календаря выбора даты.

import { Directive, ElementRef, OnInit, AfterViewInit, Input, forwardRef, OnDestroy } from '@angular/core';
import { Moment } from 'moment';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';


const DATE_PICKER_VALUE_ACCESSOR = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => FnCalendarDirective),
  multi: true,

};

@Directive({
  selector: '[fn-calendar]',
  providers: [DATE_PICKER_VALUE_ACCESSOR],
})
export class FnCalendarDirective implements OnInit, AfterViewInit, ControlValueAccessor, OnDestroy {


  @Input() format: string = 'DD/MM/YYYY HH:mm';
  @Input() showClose: boolean = true;
  @Input() sideBySide: boolean = false;
  @Input() ngModel;

  private onTouched = () => { };
  private onChange: (value: string) => void = () => { };

  constructor(private el: ElementRef) {
  }

  ngOnInit() {

  }

  ngAfterViewInit() {
    $(this.el.nativeElement).datetimepicker({
      locale: 'fr',
      sideBySide: this.sideBySide,
      format: this.format,
      showClose: this.showClose,
      icons: {
        time: 'fa fa-clock-o',
        date: 'fa fa-calendar',
        up: 'fa fa-chevron-up',
        down: 'fa fa-chevron-down',
        previous: 'fa fa-chevron-left',
        next: 'fa fa-chevron-right',
        today: 'fa fa-bullseye',
        clear: 'fa fa-trash',
        close: 'fa fa-times'
      },
    }).on('dp.change', event => {
      let date: Moment = (<Moment>(<any>event).date);
      if (date) {
        let value = date.format(this.format);
        this.onChange(value);
      }
    });
    this.writeValue(this.ngModel);
  }

  writeValue(date: string) {
    $(this.el.nativeElement).datetimepicker().data('DateTimePicker').date(date);
  }

  registerOnChange(fn: any) {
    this.onChange = fn;
  }

  registerOnTouched(fn: any) {
    this.onTouched = fn;
  }

  ngOnDestroy() {
    $(this.el.nativeElement).datetimepicker().data('DateTimePicker').destroy();
  }
}

Здесь важными являются методы writeValue, которые позволяют Angular2 уведомлять ваш плагин jquery о том, что происходит изменение. И зарегистрируйте OnChange, который позволит вам уведомить Angular2, что ваш плагин внес изменения в DOM.

В заключение, ключ к использованию jQuery - это обернуть ваш плагин jQuery внутри директивы и реализовать CustomValueAccesor для обработки связи между вашим плагином и Angular2.

Чтобы найти наборы, вы можете использовать DefinitlyTyped GitHub, который является хранилищем определения наборов из лота библиотеки js.

  [1]: http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html

Вы не должны связывать Angular компонент с jQuery любой ценой

  1. Загрузите jQuery с <script> тег.
  2. Добавить готовый обработчик документов jQuery.
  $ ('document'). ready ((function ($) {

      return function () {

        // DOM готов, а $ является ссылкой на jQuery

        // Пришло время делать вещи, используя $

      };

  })(JQuery));

Плюсы:

  • Угловой компонент не зависит от jQuery.
  • Проще протестировать такой компонент, поддерживать и повторно использовать.
  • Код jQuery изолирован.

Однако, если вам нужно использовать jQuery внутри компонентов, используйте службы или директивы.

Если у вас есть проблемы с загрузкой частичных представлений, используйте обработчик событий jQuery на узле документа и обработчик загрузки окна jQuery.

Мы можем использовать как следующим образом:

var jq=require('./jquery.min.js');
.....
export class AppComponent{
  ngOnInit(){
   jq();
   console.log($('body'))  // show:[body, prevObject: r.fn.init[1]]
                           //ok!normal operation!
  }
}

Самый быстрый и грязный способ сделать это:

(<any>window).$('.alert')
Другие вопросы по тегам