2017-01-25 19 views
5

Ponieważ chcę włączyć funkcję Przeciągnij i upuść w mojej aplikacji, postanowiłem zaimportować jQuery UI do mojego projektu Angular 2.Jak używać interfejsu jQuery z Angular 2

Najpierw zacząłem importując sam jQuery w następujący sposób:

import { ElementRef } from '@angular/core'; 
declare var jQuery:any; 

ngOnInit() { 
    jQuery(this._elRef.nativeElement).find('ul.tabs').tabs(); 
} 

Działa to doskonale dla inicjowania rzeczy. Ale gdy próbuję zrobić z funkcją .draggable() pojawia się następujący błąd:

jQuery(...).draggable is not a function

Jak mogę dokonać tej pracy? Czytałem wiele podejść, ale wszystkie używały systemu-js, którego w obecnej wersji na Angular-cli nie używam. Wiem, że używanie aplikacji jQuery w Angular 2 nie jest najlepszą metodą, ale potrzebuję siatki, w której użytkownicy mogą upuszczać widżety przeciągalne.

Jeśli masz jakieś sugestie, to będzie idealnie! Dzięki!

+0

Czy ładowania biblioteki jQuery UI gdzieś? Czy masz na przykład tag skryptu w swoim pliku 'index.html'? –

+0

Tak Jestem ładowanie go w index.html zaraz po jQuery lib –

+0

@GeorgiArnaudov Czy możesz podzielić się plunker przykład –

Odpowiedz

5

udało mi się zrobić to praca, wykonując następujące kroki:

  1. npm odinstalować jquery jquery-ui
  2. npm cache czyste
  3. npm instalacja jquery jquery-ui
  4. W angular- cli.json Dodałem moje ścieżki jquery i jquery-ui do obiektu skryptów. Oto co patrzeć:

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

Po wykonaniu tych czynności, to działa jak czar. Mam nadzieję, że pomaga komuś, kto miał z tym problemy.

+0

Czy możesz podać przykład jak wyglądają ścieżki w kroku 3? - Dzięki :) –

+0

Bump na przykład – Neph

+0

@ f.b.Sorry za opóźnienie, edytowałem moją odpowiedź i dodałem jak wygląda moja tablica scrips w kanciastym-cli.json. –

0

Możliwe, że wybrany element nie jest jeszcze dostępny, więc selektor nie znajduje elementu.

Powinieneś prawdopodobnie wywołać funkcję .draggable() w hoście cyklu życia ngAfterViewInit (która jest podobna do ngOnInit), aby upewnić się, że element DOM jest obecny przed dołączeniem.

+0

rzeczywiście próbowałem Twojej sugestii, ale bez powodzenia. Umieściłem funkcję setTimeout na 5 sekund w haku ngAfterViewInit i nie ma błędu, dopóki element nie spróbuje zainicjować. Jakieś inne sugestie? –

+0

@GeorgiArnaudov co się stanie, jeśli zarejestrujesz jQuery (element)? Czy coś drukuje? – chrispy

+0

Zalogowałem i zwróciłem obiekt z moim elementem, więc jQuery działa. Ale co jeszcze należy zrobić, aby interfejs użytkownika jQuery działał? Zawarłem skrypt tuż po jQuery, a następnie zainstalowałem typowanie zarówno dla jQuery, jak i jQuery UI. Próbowałem również zainstalować go przez npm i kiedy sprawdziłem w folderze node_modules dowiedziałem się, że nie ma żadnej jego kompilacji. Kiedy importuję "jquery-ui", pojawia się kolejny błąd: $ .each nie jest funkcją. Więc naprawdę nie wiem, dlaczego tak się dzieje ... –

1

Używam angular2 z jqueryUI. Trzeba importować jquery i jQueryUI

//SystemJS 

System.config({ 
    defaultJSExtensions: true, 
    paths: { 
     // paths serve as alias 
     'npm:': 'node_modules/' 
    }, 
    map: { 
     'app': 'app', 

     // angular bundles 
     '@angular/core': 'npm:@angular/core/bundles/core.umd.js', 
     '@angular/common': 'npm:@angular/common/bundles/common.umd.js', 
     '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', 
     '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', 
     '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', 
     '@angular/http': 'npm:@angular/http/bundles/http.umd.js', 
     '@angular/router': 'npm:@angular/router/bundles/router.umd.js', 
     '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', 
     // other libraries 
     'rxjs': 'npm:rxjs', 

     jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js', 
     jqueryui: 'npm:jqueryui/jquery-ui.min.js', 

     material: 'npm:material-design-lite/dist/material.min.js' 
    }, 
    packages: { 
     app: { main: 'main', format: 'register', defaultExtension: 'js' }, 
     'rxjs': { defaultExtension: 'js' } 
    }, 
}); 

/////////////////////////////// 

// Angular2 Komponent

import $ from 'jquery'; 
import 'jqueryui'; 
+1

Nie używam System JS, faktycznie. Używam Angular-cli, który używa teraz Webpacka. –

0

### ### WAŻNE

WRONG

import * as $ from 'jquery'; 
import 'jquery-ui-dist/jquery-ui'; 

Ponieważ kompilator jest problem.
POPRAWNIE

declare var require: any 
var $ = require('jquery'); 
require('jquery-ui-dist/jquery-ui'); 

LUB

declare var require: any 
var $ = require('jquery'); 
import 'jquery-ui-dist/jquery-ui';