javascript - Angular 2 multi-provider 用于导出依赖项的依赖项

标签 javascript typescript angular angular2-services

我即将使用 multi-provider将我的依赖项的依赖项与其自身一起导出,以便它们可以立即注入(inject)到组件中。

对于一个组件

import {Component} from 'angular2/core';
import { FOO_PROVIDERS } from './foo';

@Component({
  selector: 'app',
  providers: [FOO_PROVIDERS]
})
export class App {}

following

import {Inject, Injectable, provide} from 'angular2/core';
import {Http, HTTP_PROVIDERS} from 'angular2/http';

export class Foo {
  constructor(@Inject(Http) http) {}
}

export const FOO_PROVIDERS = [
  provide(Foo, { useClass: Foo, multi: true }),
  provide(Foo, { useValue: HTTP_PROVIDERS, multi: true })
];

会导致

No provider for Http! (App -> Foo -> Http)

this

import {Inject, provide} from 'angular2/core';
import {Http, HTTP_PROVIDERS} from 'angular2/http';

class Foo {
  constructor(@Inject(Http) http) {}
}

export const FOO_PROVIDERS = [Foo, HTTP_PROVIDERS];

会很好地工作,而我希望他们能做类似的工作。

在这种情况下是否正确使用多 vendor ?

最佳答案

当你注册provide(Foo, ...)时,你可以

constructor(foo:Foo)

使用 multi: true,您可以通过所有注册为 Foo

的提供商
constructor(foo:any)

export const FOO_PROVIDERS = [
  provide(Foo, { useClass: Foo, multi: true }),
  provide(Foo, { useValue: HTTP_PROVIDERS, multi: true })
];

constructor(@Inject(Foo) foo:Foo[])

您将传递给 foo 一个包含 Foo 实例的数组和作为第二项的提供者列表(这些包含在 HTTP_PROVIDERS)

更新

也许您对应该发生的事情有不同的期望。我看不到 @Inject(Http) http 在这里有何关联。 HTTP_PROVIDERS 仅注册为 Foo 的值。当提供商被解析时,您传递给 useValue 的值是无关紧要的。 DI 查找 Foo 的提供程序并传递分配的值,根本不关心该值是什么。您的示例中没有 Http 的提供程序,因此 Foo 本身无法注入(inject) Http。您需要注册 Http,这是在您将 HTTP_PROVIDERS 直接添加到提供程序(而不是在 useValue 中)时完成的,因为 HTTP_PROVIDERS 包含 Http(相当于 provide(Http, {useClass: Http})

更新2

// An injected service that itself needs to get passed in a dependency
@Injectable()
class Foo {
  constructor(private http:Http);
}

// container for a bunch of dependencies    
@Injectable()
class MyProviders {
  // add everything you want to make available in your components
  constructor(public foo:Foo, public bar:Bar, ...);
}

class MyComponent {
  // inject just MyProviders and use the dependencies it provides
  constructor(private providers: MyProviders) {
    // access provided values
    providers.foo.doSomething();
    providers.bar.doSomethingElse();
  }
}

// Add all providers to allow DI to resolve all above dependencies
bootstrap(AppComponent, [HTTP_PROVIDERS, Foo, Bar]);

关于javascript - Angular 2 multi-provider 用于导出依赖项的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35779102/

相关文章:

angular - Ionic 2 - 如何仅删除登录页面上的拆分面板?

Angular 7,命名路由器 socket 在延迟加载的模块中不起作用

javascript - 如何将星号位置从右更改为左 Angular Material 2?

javascript - 当我在 Angular 6 中将其设置为可编辑内容时,如何将焦点设置在该元素上?

javascript - TypeScript Store Parse 查询结果

angular - 从组件类中的可观察值中获取唯一/最新值(商店选择器的结果)

javascript - 保持回调函数执行直到 Promise 完成

javascript - 其余语法在 Chrome 49 中不起作用

javascript - 数组赋值中的引用错误(左手赋值)

javascript - 如何在页面加载时显示正在加载的 gif 图像