injector解析

injector解析injector 有两种类型 ProviderInje 和 InstanceInje 两者 get 方法执行起来有差异 ProviderInje 的结构如下 get functiongetS serviceName returncacheP serviceName InstanceInje 结构

injector 有两种类型 ,ProviderInjector 和InstanceInjector .两者get方法执行起来有差异

{ get: function getService(serviceName){ instanceCache[serviceName] ?... s = ProviderInjector.get(serviceName) invoke(s); ...} }

在service中使用到的$injector,比如 service($injector) $injector就是instanceInjector。

InstanceInjector 会先从ProviderInjector 里拿到同名service再实例化。

我们稍作跳跃。

  • 我们来模拟ng的过程
     +--------------+ | |ng| | <------------+ +--------------+ | | | require: 'ng-location' 
         
           -----Y--------+ 1. +-------------------------+ | |_ng-location__| | | | ___ ng_______| | | | +-------------------------+ | 
          
            | N V 2. moduleNgLocation = angular.module('ng-location') //angularModule(module); 1.拿到模块 回顾第一章 每一个 module 都有 invokeQueue 和 configBlock 和 runBlocks, configBlocks里是这样的结构 ['$inject' ,'invoke' ['s' ,fn(s){}] 然后 分别处理该模块的 invokeQueue 和 configBlock runInvokeQueue(moduleFn._invokeQueue); runInvokeQueue(moduleFn._configBlocks); runInvokeQueue的执行过程是 拿其中一条记录['$inject' ,'invoke' ,['$provider' ,fn($provider){}] (第一章提到的p结构)为例 p结构的第一个数据是$inject providerInjector.get('$inject'); 前文提到providerInjector.get方法是从从providerCache里取,那么‘$inject’已经存在于providerCache中了吗? 答案是 Yes . 在创建好providerInjector和 instanceInjector 中就已经放入providerCache中了 (providerCache.$inject = providerInjector) .除了$injector ,providerCache中$provider对象也早早的定义了。他们是始祖对象。 providerInjector.get('$inject') 的值实际上就是providerInjector自身. p结构的第二个数据invoke, 所以去执行invoke方法 , providerInjector.invoke( ['$provider' ,fn($provider){}]) //p结构的第三个数据 invoke会先实例化参数’$provider' 会取providerCache中取$provider ,$provider 随着providerCache定义的时候定义了。 
           
         
     args.unshift(null); return new (Function.prototype.bind.apply(fn, args))(); 实例化好之后就会放入instanceCache中了 至此ng-location模块处理结束 ,ng-location模块中factory都已实例化好,ng-location退出栈。 回到ng模块,处理方式赘同。 +--------------+ | |ng| | +--------------+ | 
         
           -----Y-------->requireAlreayTackled已处理 | new (Function.prototype.bind.apply(ngModule, args))(); 3. 
         

在ngModule中 provider($compile,$compileProvider) .前文提到$provider.provider方法是往cacheProvider中添加Provider构型的方法。至此能窥探到至关重要的$compile了。

bootstrapApply会被执行。会调用rootScope.$apply(fn);

下章讲解 compile, u element与数据间的因缘在compile展现

转载于:https://www.cnblogs.com/koushikan/p/5939401.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216970.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午10:38
下一篇 2026年3月18日 上午10:38


相关推荐

  • 解决大流量网站访问量问题

    解决大流量网站访问量问题当一个网站发展为知名网站的时候 如新浪 腾讯 网易 雅虎 网站的访问量通常都会非常大 如果使用虚拟主机的话 网站就会因为访问量过大而引起服务器性能问题 这是很多人的烦恼 有人使用取消 RSS 等错误的方法来解决问题 显然是下错药 那么对于大流量的网站 需要采用什么样的方法来解决访问量问题 解决方法参考如下 首先 确认服务器硬件是否足够支持当前的流量 普通的 P4 服务器一般最多

    2026年3月16日
    2
  • pycharm 连接数据库报错[通俗易懂]

    pycharm 连接数据库报错[通俗易懂]pycharm连接数据库报错请问出现下面报错是什么原因呢,数据库已连接,运行后就这样了C:\Users\MACHENIKE\PycharmProjects\untitled9\venv\Scripts\python.exeC:/Users/MACHENIKE/PycharmProjects/untitled11/venv/Online-Bookstore-Management-System-master/v1.0/Book_informationUI.pyTraceback(mostrec.

    2022年8月25日
    7
  • MFC图像处理CImage类常用操作

    MFC图像处理CImage类常用操作原文作者 aircraft 原文地址 https www cnblogs com DOMLX p 9598974 htmlMFC 图像处理 CImage 类常用操作 CImage 类头文件为 include atlimage h CImage 类读取图片 CImage Load src bmp CImage 类保存图片 CImage Save dst jpg atlimage h

    2026年3月17日
    3
  • Java数据库JDBC——prepareStatement的用法和解释

    Java数据库JDBC——prepareStatement的用法和解释转自:http://blog.csdn.net/QH_JAVA/article/details/48245945一、prepareStatement的用法和解释1.PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程2.使用Statement对象。在对数据库只执行一次性存取的时侯,用Statement对象进行处理。Prepared…

    2022年4月28日
    61
  • 【汇编小白】关于masm5.0 显示 Unable to open input file

    【汇编小白】关于masm5.0 显示 Unable to open input file   然后, &lt;https://blog.csdn.net/w605283073/article/details/8334732?_t_t_t=0.2288642483095238&gt;这里也有讲解(侵删)ummmmm…第一次在这个平台写东西,不知道有没有人看and…为啥这个文章的标签,中文我加不来。,。加不来啊 (win10自带的微软输入法。,。输中文输一…

    2022年7月17日
    20
  • 【Flume】batchSize和transactionCapacity区别

    batchSize是针对Source和Sink提出的一个概念,它用来限制source和sink对event批量处理的。即一次性你可以处理batchSize个event,这个一次性就是指在一个事务中。当你处理的event数量超出了batchSize,那么事务就会提交了。注意,这里有一个隐晦的地方,就是batchSize一定不能大于transactionCapacitytransactionC…

    2022年4月15日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号