2016-06-28 6 views
1

Это небольшая вещь, но она меня подслушивала. Я могу добавить экземпляр Renderer в компонент и использовать его в порядке. Я не понимаю, как это работает. Насколько я могу найти в исходном коде, только DomRootRenderer_ предоставляется внутри Browser_App_Providers в качестве RootRenderer. Однако фактическая реализация Renderer - это класс DomRenderer, на который я не смог найти поставщика. Итак, как же DI Renderer? Является ли это вызов метода RenderComponent на DomRootRenderer_? Может ли кто-нибудь указать меня в нужное место в источнике?Когда установлен Угловой 2 Renderer?

ответ

0

Когда компонент создан новый ребенок форсунка инжектора родительских компонентов создается для нового компонента. Когда этот дочерний инжектор создается, могут добавляться дополнительные поставщики. Angular2 ли это с providers и viewProviders вы добавляете в свой @Component() декоратора, и это также добавляет ряд других поставщиков, как ElementRef, ViewContainerRef, Injector, родительский компонент, ...

Как создать дочерний инжектор, например Показаны в https://stackoverflow.com/a/37734641/217408

См. также https://angular.io/docs/ts/latest/api/core/index/DirectiveMetadata-class.html, как поставщики разрешаются при создании экземпляра компонента.

+0

Я думаю, что не правильно сформулировал свой вопрос, или, может быть, я просто не понимаю ваш ответ. В основном я смущен тем, как DI разрешает Renderer на конкретный класс DomRenderer (https://github.com/angular/angular/blob/master/modules/%40angular/platform-browser/src/dom/dom_renderer. TS # L58). BrowserAppProvider (https://github.com/angular/angular/blob/master/modules/%40angular/platform-browser/src/browser.ts#L64) предоставляет только DomRootRenderer и RootRenderer, оба из которых используют один и тот же класс DomRootRenderer_, я думаю? Итак, когда DomRenderer предоставляется как Renderer? –

+0

Я не нашел, где он добавлен к провайдерам, но я предполагаю, что это то, что возвращается из 'DomRootRenderer.renderComponent()' (https://github.com/angular/angular/blob/3644eef860cdc31a22368acd48b0e657fd89f501/modules/%40angular/ platform-browser/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; 
    } 
Смежные вопросы