我正在尝试使用APP_INITIALIZER从配置文件加载数据.我收到以下错误:
"Unhandled Promise rejection:this.appInits [i]不是函数; Zone :; Task:Promise.then; Value:TypeError:this.appInits [i]不是函数"
码:
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Rx';
@Injectable()
export class ApiConfig {
private urlList: any = null;
constructor(private http: Http) {
}
public getUrl(key: any) {
return this.urlList[key];
}
public loadConfig(){
let retPromise: Promise<any> = this.http.get('./assets/config/api-config.json')
.map(res => res.json()).toPromise();
retPromise.then(resp => this.urlList=resp.urlList);
//this.urlList = retPromise.urlList;
return retPromise;
}
}
export function apiConfigProvider(config: ApiConfig) {
config.loadConfig();
}
Run Code Online (Sandbox Code Playgroud)
对我做错的任何帮助?
编辑: …
我们何时应该使用useExisting提供程序而不是useClass?
providers: [
{provide: Class1, useClass: Class1},
{provide: Class2, useExisting: Class2}]
Run Code Online (Sandbox Code Playgroud)
评论:我没有在SO上找到确切的问题.为了更好的索引决定在这里创建这个特定的索引,虽然我找到了这个答案:
但是想有更多真实的例子
我期待Angular loadConfig()在构建其他服务之前等待我的函数结算,但事实并非如此.
app.module.ts
export function initializeConfig(config: AppConfig){
return () => config.loadConfig();
}
@NgModule({
declarations: [...]
providers: [
AppConfig,
{ provide: APP_INITIALIZER, useFactory: initializeConfig, deps: [AppConfig], multi: true }
] })
export class AppModule {
Run Code Online (Sandbox Code Playgroud)
}
app.config.ts
@Injectable()
export class AppConfig {
config: any;
constructor(
private injector: Injector
){
}
public loadConfig() {
const http = this.injector.get(HttpClient);
return new Promise((resolve, reject) => {
http.get('http://mycoolapp.com/env')
.map((res) => res )
.catch((err) => {
console.log("ERROR getting config data", err );
resolve(true);
return Observable.throw(err …Run Code Online (Sandbox Code Playgroud) bootstrapping dependency-injection angular-services angular angular-di
角度依赖注入允许您使用令牌而不是服务类注入字符串,函数或对象.
我在我的模块中声明它是这样的:
providers: [{ provide: MyValueToken, useValue: 'my title value'}]
Run Code Online (Sandbox Code Playgroud)
我这样使用它:
constructor(@Inject(MyValueToken) my_value: string) {
this.title = my_value;
}
Run Code Online (Sandbox Code Playgroud)
但是,如何更新组件中的值并让其他组件每次都获得新值?换句话说,我想模拟使用类似a BehaviorSubject来发射和接收值的功能.
如果这不可能,那么如果它们仅提供静态数据,那么这些注入令牌值的用途是什么,而我可以简单地在我的组件中声明静态值并直接使用它.
typescript angular-services angular-decorator angular angular-di
我将重点放在开发工具中的组件元素上,可以执行以下操作:
ng.probe($0)
Run Code Online (Sandbox Code Playgroud)
获取特殊对象" DebugElement ".现在我们可以得到它的注射器:
ng.probe($0).injector
Run Code Online (Sandbox Code Playgroud)
现在我想得到一个在这个组件上定义的依赖.依赖性被定义为类,所以我应该这样做:
ng.probe($0).injector.get(MyService)
Run Code Online (Sandbox Code Playgroud)
但!服务器未在控制台范围中定义.如果我把它变成一个字符串:
ng.probe($0).injector.get('MyService')
Run Code Online (Sandbox Code Playgroud)
显然它也行不通.
我正在尝试在ReflectiveInjector.get上进行逆向工程,但现在没有运气.有任何想法吗?
我想在我的应用程序中提供一个基于url的QueryParam的常量.
localhost:4200?flag=true
Run Code Online (Sandbox Code Playgroud)
在我的模块提供商中,我添加了
{ provide: FLAG, useFactory: FlagFactory, deps: [...] }
Run Code Online (Sandbox Code Playgroud)
所以我感兴趣的是,如果没有手动解析URL,有一种方法可以做到这一点
function FlagFactory() {
return location.search.includes('flag');
}
Run Code Online (Sandbox Code Playgroud) Angular 5.x将包含本推文中StaticInjector提到的新内容.我有两个问题:
我已经仔细阅读了文档,尽管找不到确切的引用位置,但我的印象是,在急切加载的模块providers数组中声明服务将使单例适用于应用程序范围。如果这是真的,
是使用
@InjectableprovidedIn任何非延迟加载模块一样providedIn: "root"?
当我们创建Component,Pipe用angular-cli命令,CLI会自动将它们在特定模块的声明数组,为什么不服务的情况下发生的。
我使用DI在几个组件中注入服务.现在它不是一个常见的实例.
如何只为几个组件保留一个服务实例?
我试图app.module在部分加载服务providers