(inject, vm)
| 5343 | |
| 5344 | // inject 选项应该是一个字符串数组或一个对象,该对象的 key 代表了本地绑定的名称,value 为其 key (字符串或 Symbol) 以在可用的注入中搜索。 |
| 5345 | function resolveInject(inject, vm) { |
| 5346 | |
| 5347 | if (inject) { |
| 5348 | // inject is :any because flow is not smart enough to figure out cached |
| 5349 | // inject是:any,因为flow不够智能,无法计算缓存 |
| 5350 | var result = Object.create(null); |
| 5351 | var keys = hasSymbol ? //判断是否支持Symbol 数据类型 |
| 5352 | Reflect.ownKeys(inject).filter(function (key) { |
| 5353 | //Object.getOwnPropertyDescriptor 查看描述对象 并且获取到enumerable 为true 的时候才会获取到该数组 |
| 5354 | return Object.getOwnPropertyDescriptor(inject, key).enumerable |
| 5355 | }) : |
| 5356 | Object.keys(inject); //如果不支持hasSymbol 则降级用 Object.keys |
| 5357 | |
| 5358 | // 将数组转化成对象 比如 [1,2,3]转化成 |
| 5359 | // * normalized[1]={from: 1} |
| 5360 | for (var i = 0; i < keys.length; i++) { //循环key |
| 5361 | var key = keys[i]; //获取单个key值 |
| 5362 | var provideKey = inject[key].from; //normalized[3]={from: 3} 获取key的值 |
| 5363 | var source = vm; |
| 5364 | while (source) { |
| 5365 | if (source._provided && hasOwn(source._provided, provideKey)) { //判断_provided 存在么 并且是对象的时候,并且实例化属性provideKey 存在 |
| 5366 | result[key] = source._provided[provideKey]; //获取值 存起来 |
| 5367 | break |
| 5368 | } |
| 5369 | source = source.$parent; //循环父节点 |
| 5370 | } |
| 5371 | if (!source) { //如果vm 不存在 |
| 5372 | if ('default' in inject[key]) { // 判断default key存在inject[key]中么 |
| 5373 | var provideDefault = inject[key].default; //如果存在则获取默认default的值 |
| 5374 | result[key] = typeof provideDefault === 'function' //如果是函数则执行 |
| 5375 | ? provideDefault.call(vm) |
| 5376 | : provideDefault; |
| 5377 | } else { |
| 5378 | warn(("Injection \"" + key + "\" not found"), vm); |
| 5379 | } |
| 5380 | } |
| 5381 | } |
| 5382 | return result |
| 5383 | } |
| 5384 | } |
| 5385 | |
| 5386 | /* */ |
| 5387 |
no test coverage detected