0

Ich versuche, die Moment.js-Bibliothek in Angular2 zu importieren. Ich fand die folgende Lösung:So importieren Sie Javascript-Bibliothek in angular2 global

import {Component} from 'angular2/core'; 
import * as moment from 'moment'; 

@Component({ 
    selector: 'app', 
    template: require('./app.component.html') 
}) 
export class AppComponent { 
    moment:any = moment; 
    constructor() {} 
} 

Aber ich will das nicht Ich muss jede Komponente importieren. Gibt es eine Möglichkeit, es global zu injizieren, damit ich es in allen meinen Komponenten verwenden kann?

Antwort

4

Leiten Sie Ihre Komponenten von einem gemeinsamen Basistyp ab, der den Moment importiert.

Eltern

import * as moment from 'moment'; 

export class MomentAwareClass { 
    moment:any = moment; 
    constructor() {} 
} 

Kinder

import {Component} from 'angular2/core'; 

@Component({ 
    selector: 'app', 
    template: require('./app.component.html') 
}) 
export class AppComponent extends MomentAwareClass { 
    constructor() {} 
} 

aktualisieren

Ein anderer Weg ist Dependency Injection zu verwenden, um einen Dienst mit dem Injectable() Dekorateur zu schreiben, dies wird Ihre Klasse Last schneller machen.

import { Injectable } from '@angular/core'; 
import * as moment from 'moment'; 

@Injectable() 
export class SomeClass { 
    public moment: any = moment; 
} 
+0

Vielen Dank! Das ist ein netter Ansatz. Ich würde gerne abwarten, ob es noch andere Alternativen gibt. – kdu

+0

Sie können etwas nicht injizieren, das nicht als @injectable markiert ist. Es ist einfach nicht möglich mit einer 3rd-Party-Bibliothek wie diesem, es sei denn, Sie wickeln es in einen Service Winkel versteht. Dies ist wahrscheinlich eine bessere Lösung als das, was ich oben beschrieben habe, weil es kompositorischer ist. – KnowHoper

4

Von dem, was ich gelesen here, kann ich die momentjs Bibliothek bereitstellen, wenn Bootstrap die gesamte Anwendung wie folgt aus:

import * as moment from 'moment'; 
import {provide} from 'angular2/core'; 
import {bootstrap} from 'angular2/platform/browser'; 

bootstrap(App, [ 
    provide("moment", {useValue:moment}) 
]) 

Dann kann ich es in meiner eigenen Komponente verwenden, indem DI verwendet wird, wie folgt aus:

import {Component, OnInit, Inject} from 'angular2/core'; 

@Component({ 
    selector: 'app', 
    template: require('./app.component.html') 
}) 
export class AppComponent { 
    constructor(@Inject("moment") private moment) {} 
} 
Verwandte Themen