这是一件小事,但它一直困扰着我。我可以将一个Renderer实例注入一个组件并使用它。我不明白的是这是如何工作的。据我所知,在源代码中,只有DomRootRenderer_作为RootRenderer在Browser_App_Providers中提供。但是,Renderer的实际实现是DomRenderer类,我找不到它的提供者。那么DI如何解析渲染器呢?它是在某个地方调用DomRootRenderer_上的RenderComponent方法吗?有人能指出我在源头的正确位置吗?
答案 0 :(得分:0)
这是来自文档,RootRenderer
:
/**
* Injectable service that provides a low-level interface for modifying the UI.
*
* Use this service to bypass Angular's templating and make custom UI changes that can't be
* expressed declaratively. For example if you need to set a property or an attribute whose name is
* not statically known, use {@link #setElementProperty} or {@link #setElementAttribute}
* respectively.
*
* If you are implementing a custom renderer, you must implement this interface.
*
* The default Renderer implementation is `DomRenderer`. Also available is `WebWorkerRenderer`.
* @experimental
*/
export abstract class RootRenderer {
abstract renderComponent(componentType: RenderComponentType): Renderer;
}
答案 1 :(得分:0)
创建组件时,会为新组件创建父组件注入器的新子注入器。创建此子注入器时,可以添加其他提供程序。 Angular2通过您添加到@array = sort { lc($a) cmp lc($b) } @array;
装饰器中的providers
和viewProviders
执行此操作,并且还添加了一系列其他提供商,例如@Component()
,ElementRef
,{{ 1}},父组件,......
如何创建子注入器例如显示在https://stackoverflow.com/a/37734641/217408
中另请参阅https://angular.io/docs/ts/latest/api/core/index/DirectiveMetadata-class.html,了解在创建组件实例时如何解析提供程序。