梳理下angular的运行流程:
JQLitePrototype.ready
JQLite.on
此处涉及到expandoStore 的问题
on里面主要是addHandler 放到eventFns里
等到onload后 再调用
angularInit
bootstrap
doBootstrap
createInjector
injectionArgs
invoke -> $RootScopeProvider
以表达式 文本插值来梳理:
collectDirectives -> addTextInterpolateDirective -> $interpolate
$interpolate函数中调用parse函数,parse函数里
addInterceptor(parsedExpression, interceptorFn)
parsedExpression 为解析后的表达式,interceptorFn 为 parseStringifyInterceptor
parsedExpression外面再封装一层 regularInterceptedExpression函数
regularInterceptedExpression函数的watchDelegate 为inputsWatchDelegate。
$interpolate函数返回的 interpolateFn实际是 调用 extend函数过后的函数:
1 | //返回interpolationFn方法 |
所以此时的调用文本指令的时候,此时scope已经为childScope:
1 | scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { |
这里的interpolateFn 就是上面的function interpolationFn(context) 函数,
因为带有watchDelegate,所以直接调用watchDelegate返回:
1 | //如果被解析过后的watch函数有watch的代理那就返回这个代理watch函数 |
从而进入
scope.$watchGroup :
1 | function $watchGroup: function(watchExpressions, listener) { |
此时watchExpressions就是 parseFns ,那继续进入watch,那此时的watchDelegate就是
inputsWatchDelegate。
1 | function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { |
实际这个插值的watchers就只有一个,就是这个expressionInputWatch