加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – 我可以使用自定义ReflectiveInjector策略来获取组件

发布时间:2020-12-17 07:51:18 所属栏目:安全 来源:网络整理
导读:众所周知,我们对提供者有不同的策略:useClass,useExisting,useFactory,useValue.但是,如果我想添加自己的策略呢?就像是: providers: [ { MyService: MyService,useAsyncFactory: MyAsyncFactory} ] 扩展ReflectiveInjector并使Angular使用扩展变体的最佳
众所周知,我们对提供者有不同的策略:useClass,useExisting,useFactory,useValue.但是,如果我想添加自己的策略呢?就像是:
providers: [ { MyService: MyService,useAsyncFactory: MyAsyncFactory} ]

扩展ReflectiveInjector并使Angular使用扩展变体的最佳方法是什么?我发现the place已定义,但仍在寻找覆盖现有Angular DI机制的方法.

P.S.:请不要问我为什么需要它,为什么不使用现有的策略.我正在研究Angular DI,答案将帮助我更好地理解它.

在引擎盖下,Angular不使用ReflectiveInjector来检索组件提供程序,因此即使您设法扩展ReflectiveInjector,它也不会对组件提供程序产生影响.你可以看到它 here:
function resolveDep(...) {
       ...
        default:
          const providerDef =
              (allowPrivateServices ? elDef.element !.allProviders :
                                      elDef.element !.publicProviders) ![tokenKey];
          if (providerDef) {
            const providerData = asProviderData(view,providerDef.index);
                                 ^^^^^^^^^^^^^^^
            if (providerData.instance === NOT_CREATED) {
              providerData.instance = _createProviderInstance(view,providerDef);
            }
            return providerData.instance;
          }

组件请求依赖时调用该方法,例如ViewContainerRef:

class MyComponent {
   constructor(vc: ViewContainerRef)

而这一行:

const providerData = asProviderData(view,providerDef.index);

显示从视图节点检索依赖关系,而不是反射注入器.所以当你这样做时:

constructor(i: Injector) {
   console.log(i instanceOf ReflectiveInjector); // false
}

你会发现它不是真的. It’s just a wrapper围绕resolveDep函数,它封闭在视图和相关视图节点上.

反射注射器仍用于主视图注射器.这是您动态实例化组件时传递的注入器:

componentFactory.create(hostViewInjector)

Here is相关代码:

const value = startView.root.injector.get(depDef.token,NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR);

如果无法在组件或主机视图注入器上解析依赖关系,也会查询模块注入器.
Here is相关代码:

return startView.root.ngModule.injector.get(depDef.token,notFoundValue);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读