我想通过我的应用程序注入时间
我刚刚开始学习ng2,但在文档中找不到这种用法
以下是我在app.module.ts
中的内容:
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';
import {FormsModule} from '@angular/forms';
import {HttpModule} from '@angular/http';
import {AppComponent} from './app.component';
import * as moment from 'moment';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [{provide: 'moment', useValue: moment}],
bootstrap: [AppComponent]
})
export class AppModule {
}
这是组件:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.sass']
})
export class AppComponent {
title = 'app works!';
constructor(private moment) {
this.title += this.moment;
}
}
出现此错误:
Uncaught Error: Can't resolve all parameters for AppComponent:
如何正确完成?
更新的模块
const moment = new OpaqueToken('moment');
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [{provide: moment, useValue: moment}],
bootstrap: [AppComponent]
})
export class AppModule {
}
更新的组件
import { Component } from '@angular/core';
import * as moment from 'moment';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.sass']
})
export class AppComponent {
title = 'app works!';
constructor(private moment: moment) {
this.title += this.moment()
}
}
此行constructor(private moment: moment)
出现错误,告知:Cannot find name 'moment'.
答案 0 :(得分:3)
您需要使用OpaqueToken
,这将允许您创建基于字符串的令牌。我建议您更改moment
的名称,以避免与库的moment
变量发生冲突。
// You can place this is some file, so that you can export it.
export const Moment = new OpaqueToken('moment');
然后你可以使用
providers: [{provide: MomentStatic, useClass: moment}],
您可以浏览this article了解更多详情
虽然使用依赖项将其包含在Component构造函数中。
constructor(private moment: MomentStatic)
答案 1 :(得分:2)
瞬间本身不是Angular2的注射剂。但它可以包裹在一个内部。
<强> moment.service.ts 强>
import { Injectable } from '@angular/core';
import * as m from 'moment';
@Injectable()
export class MomentService {
moment = m;
}
<强> app.module.ts 强>
import { MomentService } from './moment.service';
@NgModule({
providers: [MomentService]
...
<强> app.component.ts 强>
import { MomentService } from './moment.service';
export class AppComponent {
constructor(private ms: MomentService){
console.log('Moment:' + this.ms.moment("20111031", "YYYYMMDD").toString());
}
}
不完美,但有效。
答案 2 :(得分:0)
不必注入瞬间,它是一个可以“使用”的库。现在您可以使用时刻的功能,将它导入您的打字稿文件就足够了。
答案 3 :(得分:0)
如果您正在加载moment.js,那么全局可以使用服务包装它,然后您可以在整个应用程序中注入它?
import {Moment} from '../../node_modules/moment';
import { Injectable } from '@angular/core';
declare var moment: any;
@Injectable()
export class MomentService {
constructor() { }
get(): Moment {
return moment;
}
}
我通过这种方式在编码时获得TS IntelliSense(至少我在VSCode中),您也可以轻松处理模拟时刻。
答案 4 :(得分:0)
我找到的最佳解决方法是创建一个包装器服务,但也使用getter直接在服务本身上公开一些最常用的方法:
import { Injectable } from '@angular/core';
import * as moment from 'moment';
/**
* A wrapper for the moment library
*/
@Injectable()
export class MomentService {
/**
* Creates and returns a new moment object with the current date/time
*/
public moment() { return moment(); }
// expose moment properties directly on the service
public get utc() { return moment.utc; }
public get version() { return moment.version; }
public get unix() { return moment.unix; }
public get isMoment() { return moment.isMoment; }
public get isDate() { return moment.isDate; }
public get isDuration() { return moment.isDuration; }
public get now() { return moment.now; }
}
答案 5 :(得分:0)
现在不确定这是否有帮助,但您需要与以下相似的内容(未经测试)才能使其在您的服务中发挥作用。
import { Inject } from '@angular/core';
constructor(@Inject(moment) private moment) {
this.title += this.moment()
}
关键位是 @Inject