我们很清楚有多种方法可以为导入的模块设置配置。我们有 '.forRoot()'、'useValue'、'useClass' 等要在导入模块中使用。
例如,我们想使用ng2-currency-mask。直接从文档中的示例用法中获取,我们可以CurrencyMaskModule
通过在导入模块(在本例中为 AppModule)中执行此操作来设置配置:
export const CustomCurrencyMaskConfig: CurrencyMaskConfig = {
align: "right",
allowNegative: true,
decimal: ",",
precision: 2,
prefix: "Module$ ",
suffix: "",
thousands: "."
};
@NgModule({
imports: [
...
CurrencyMaskModule
],
declarations: [...],
providers: [
{ provide: CURRENCY_MASK_CONFIG, useValue: CustomCurrencyMaskConfig }
],
bootstrap: [AppComponent]
})
export class AppModule {}
但是,如果您想useValue
动态设置 config/ (例如设置页面),我们必须从组件中更改它。现在我使用以下直接编写的代码进行了测试AppComponent
:
import { Component, OnInit, Inject } from '@angular/core';
import { CURRENCY_MASK_CONFIG, CurrencyMaskConfig } from 'ng2-currency-mask/src/currency-mask.config';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'Testing Config App';
constructor(
@Inject(CURRENCY_MASK_CONFIG) ng2CurrencyMaskConfig: CurrencyMaskConfig,
) {
// test
ng2CurrencyMaskConfig = {
align: 'right',
allowNegative: false,
decimal: '.',
precision: 5,
prefix: 'Component$$$ ',
suffix: '',
thousands: ','
};
}
ngOnInit() {
}
}
不幸的是,这种变化并没有反映到使用的组件上,ng2-currency-mask
并且从AppModule
(带有“Module$” asprefix
的那个)设置的配置仍然有效。
您如何从组件中成功覆盖/设置模块的配置?
更新:
我尝试过使用ReflectiveInjector
'sresolve
和fromResolvedProviders
方法也不起作用:
import { Component, OnInit, ReflectiveInjector, Injector } from '@angular/core';
import { CURRENCY_MASK_CONFIG, CurrencyMaskConfig } from 'ng2-currency-mask/src/currency-mask.config';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'Testing Config App';
constructor(
private injector: Injector,
) {
}
ngOnInit() {
// test
const ng2CurrencyMaskConfig: CurrencyMaskConfig = {
align: 'right',
allowNegative: false,
decimal: '.',
precision: 3,
prefix: 'TESTR$ ',
suffix: '',
thousands: ','
};
const providers = ReflectiveInjector.resolve([{ provide: CURRENCY_MASK_CONFIG, useValue: ng2CurrencyMaskConfig }]);
ReflectiveInjector.fromResolvedProviders(providers, this.injector);
}
}
并且使用静态Injector
不起作用:
Injector.create(
[
{
provide: CURRENCY_MASK_CONFIG,
useValue: ng2CurrencyMaskConfig
}
],
this.injector);
旁注:我很清楚这个特定模块(CurrencyMaskModule
)的替代解决方案,我们实际上可以只创建一个具有可变属性的提供程序来保存该CurrencyMaskConfig
值。但这将让我被迫更改所有输入字段以options
使用该currencyMask
指令向所有输入字段添加属性。换句话说,我将[options]="myConfigProvider.currencyMaskConfig"
在所有需要它的输入中插入类似的东西。我希望看到一种更好/更优雅的方式来做到这一点。