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
