Je veux envelopper du code jQuery dans une directive Angular2.
J'ai installé la bibliothèque jQuery for Typings dans mon projet avec la commande suivante:
typings install dt~jquery --save --global
Alors maintenant, j'ai le dossier jquery
sous le dossier typings/global
dans mon répertoire de projet. De plus, la nouvelle ligne suivante a été ajoutée à mon fichier typings.json
:
{
"globalDependencies": {
"core-js": "registry:dt/core-js#0.0.0+20160602141332",
"jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
"node": "registry:dt/node#6.0.0+20160807145350",
"jquery": "registry:dt/jquery#1.10.0+20160908203239"
}
}
J'ai commencé à écrire une nouvelle directive Angular2 (que j'ai importée dans un fichier app-module
) mais je ne sais pas comment importer correctement la bibliothèque jQuery. Voici mon fichier source:
import {Directive} from '@angular/core';
@Directive({
selector: "my-first-directive"
})
export class MyFirstDirective {
constructor() {
$(document).ready(function () {
alert("Hello World");
});
}
}
Mais je ne peux pas utiliser ni $
ni jQuery
. Quelle est la prochaine étape?
Étape 1: installez jquery dans votre projet
npm install jquery
Étape 2: ajout du type pour jquery
npm install -D @types/jquery
Étape 3: Utilisez-le dans votre composant!
import * as $ from 'jquery';
Prêt à utiliser $!
Si vous utilisez "@ angular/cli", installez alors:
npm install jquery --save
Deuxième étape installer:
install: npm install @types/jquery --save-dev
Et trouvez votre nom de fichier dans "angular-cli.json" à la racine et ajoutez l'intérieur de comme:
script:["../node_modules/jquery/dist/jquery.min.js"]
Maintenant ça va marcher.
jQuery.service.ts
import { OpaqueToken } from '@angular/core'
export let JQ_TOKEN = new OpaqueToken('jQuery');
index.ts`
export * from './jQuery.service';
app.module.ts
declare let jQuery : Object;
@NgModule({
providers: [
{ provide: TOASTR_TOKEN, useValue: toastr },
{ provide: JQ_TOKEN, useValue: jQuery },
})
export class AppModule { }
comment utiliser Jquery en composant
import { Component, Input, ViewChild, ElementRef, Inject } from '@angular/core'
import { JQ_TOKEN } from './jQuery.service'
@Component({
selector: 'simple-modal',
template: `
<div id="{{elementId}}" #modalcontainer class="modal fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
<h4 class="modal-title">{{title}}</h4>
</div>
<div class="modal-body" (click)="closeModal()">
<ng-content></ng-content>
</div>
</div>
</div>
</div>
`,
styles: [`
.modal-body { height: 250px; overflow-y: scroll; }
`]
})
export class SimpleModalComponent {
@Input() title: string;
@Input() elementId: string;
@Input() closeOnBodyClick: string;
@ViewChild('modalcontainer') containerEl: ElementRef;
constructor(@Inject(JQ_TOKEN) private $: any) {}
closeModal() {
if(this.closeOnBodyClick.toLocaleLowerCase() === "true") {
this.$(this.containerEl.nativeElement).modal('hide');
}
}
}
Vous pouvez également charger votre fichier Javascript jQuery dans une balise script
normale dans la section head
de votre fichier index.html.
<html>
<head>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js" />
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.1.8/semantic.min.js" />
...
</head>
...
Puis, dans le composant ou la directive où vous en avez besoin, déclarez simplement la variable $
nécessaire à jQuery, car vous ne disposerez pas des typages nécessaires pour tous les plugins dont vous avez besoin:
import {Directive} from '@angular/core';
declare var $: any;
@Directive({
selector: "my-first-directive"
})
export class MyFirstDirective {
constructor() {
$(document).ready(function () {
alert("Hello World");
});
}
}
Vous devriez avoir un typings.json qui pointe vers votre fichier de frappe jQery. Ensuite:
systemjs.config (remarque de configuration de carte pour jquery)
System.config({
defaultJSExtensions: true,
paths: {
// paths serve as alias
'npm:': 'node_modules/'
},
map: {
'app': 'app',
jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js',
material: 'npm:material-design-lite/dist/material.min.js',
// angular bundles
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
....
},
packages: {
app: { main: 'main', format: 'register', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' }
},
});
En composant:
import $ from 'jquery';
Ensuite, utilisez $ comme d'habitude.
C'est une vieille question et il y a déjà des réponses. Cependant, les réponses existantes sont trop compliquées (la réponse de l'utilisateur1089766 contient de nombreux éléments inutiles). J'espère que cela aide quelqu'un de nouveau.
Ajoutez <script src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
dans votre fichier index.html
.
Créez jQuery.Service.ts:
import {InjectionToken} from "@angular/core";
export let jQueryToken = new InjectionToken('jQuery');
Dans votre fichier de module, ajoutez ce jQueryToken au fournisseur:
providers:[
{
provide: jQueryToken,
useValue: jQuery
}]
Maintenant, @Inject(jQueryToken)
et il est prêt à être utilisé. Supposons que vous souhaitiez utiliser un nom de composant ExperimentComponent alors:
import {Component, Inject, OnInit} from '@angular/core';
import {jQueryToken} from "./common/jquery.service";
@Component({
selector: 'app-experiment',
templateUrl: './experiment.component.html',
styleUrls: ['./experiment.component.css']
})
export class ExperimentComponent implements OnInit {
constructor(@Inject(jQueryToken) private $: any) {
$(document).ready(function () {
alert(' jQuery is working');
});
}
ngOnInit() {
}
}
Chaque fois que vous ouvrez ExperimentComponent, la fonction d'alerte appelle et affiche le message.
Je ne pense pas que l'utilisation de jQuery avec Angular 2. devrait poser problème Si les typages et les dépendances pour jQuery sont correctement installés, il ne devrait pas être problématique d'utiliser JQery dans Angular 2.
J'ai pu utiliser jquery dans mon projet 2 angulaire avec une installation correcte. Et par installation correcte, j'entends l'installation de typages jquery afin de le reconnaître dans TypeScript.
Après cela, j'ai pu utiliser jquery de la manière suivante:
jQuery(document).ready({
()=>{
alert("Hello!");
};
});