2016-06-28 14 views
1

これは小さなことですが、私を悩ませています。 Rendererのインスタンスをコンポーネントに挿入して、それをうまく使用することができます。私が理解できないことは、これがどのように機能しているかです。私がソースコードで見つけることができる限り、DomRootRenderer_のみがBrowser_App_Providersの内部でRootRendererとして提供されます。しかし、Rendererの実際の実装はDomRendererクラスであり、プロバイダを見つけることができませんでした。だから、DIはどのようにレンダラーを解決していますか? DomRootRenderer_のどこかでRenderComponentメソッドを呼び出していますか?誰かが私をソースの正しい場所に向けることができますか?角度2レンダラーはいつ提供されますか?

答えて

0

。この子インジェクタが作成されると、追加のプロバイダを追加できます。 Angular2子インジェクターを作成する方法をprovidersviewProvidersあなた@Component()デコレータに追加すると、それはまたElementRefのような他のプロバイダのシリーズを追加し、ViewContainerRefInjector、親コンポーネント、...

では、例えばあることを行いますhttps://stackoverflow.com/a/37734641/217408

また、コンポーネントインスタンスの作成時にプロバイダが解決される方法については、https://angular.io/docs/ts/latest/api/core/index/DirectiveMetadata-class.htmlを参照してください。

+0

私はフレーズ私の質問正しく、または多分私はあなたの答えを理解していないと思う。基本的に私はDIがどのようにレンダラーを具体的なクラスDomRenderer(https://github.com/angular/angular/blob/master/modules/%40angular/platform-b​​rowser/src/dom/dom_renderer)に解決しているのか混乱しています。 ts#L58)。 BrowserAppProvider(https://github.com/angular/angular/blob/master/modules/%40angular/platform-b​​rowser/src/browser.ts#L64)は、両方とも同じクラスを使用するDomRootRendererとRootRendererのみを提供していますDomRootRenderer_だと思いますか?したがって、DomRendererはレンダラーとしていつ提供されますか? –

+0

プロバイダに追加された場所が見つかりませんでしたが、DomRootRenderer.renderComponent()から返されるものと仮定しています(https://github.com/angular/angular/blob/3644eef860cdc31a22368acd48b0e657fd89f501/modules/%40angular/プラットフォームブラウザ/ src/dom/dom_renderer.ts#L42) –

+0

それは私が同様に仮定しているものです。 RootRendererとDomRootRendererの両方にuseFactoryが用意されていなかったので、renderComponentが呼び出されたときはわからなかったので、ちょっと驚いていました。しかし、私は元の投稿で言ったように、大したことではありません。ご協力いただきありがとうございます。 –

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; 
    } 
関連する問題