@@ -45,6 +45,7 @@ function Compiler (vm, options) {
4545 compiler . vm = vm
4646 compiler . bindings = makeHash ( )
4747 compiler . dirs = [ ]
48+ compiler . deferred = [ ]
4849 compiler . exps = [ ]
4950 compiler . computed = [ ]
5051 compiler . childCompilers = [ ]
@@ -117,6 +118,11 @@ function Compiler (vm, options) {
117118 // and bind the parsed directives
118119 compiler . compile ( el , true )
119120
121+ // bind deferred directives (child components)
122+ for ( var i = 0 , l = compiler . deferred . length ; i < l ; i ++ ) {
123+ compiler . bindDirective ( compiler . deferred [ i ] )
124+ }
125+
120126 // extract dependencies for computed properties
121127 if ( compiler . computed . length ) {
122128 DepsParser . parse ( compiler . computed )
@@ -247,7 +253,10 @@ CompilerProto.compile = function (node, root) {
247253 directive = Directive . parse ( 'repeat' , repeatExp , compiler , node )
248254 if ( directive ) {
249255 directive . Ctor = componentCtor
250- compiler . bindDirective ( directive )
256+ // defer child component compilation
257+ // so by the time they are compiled, the parent
258+ // would have collected all bindings
259+ compiler . deferred . push ( directive )
251260 }
252261
253262 // v-with has 2nd highest priority
@@ -256,7 +265,7 @@ CompilerProto.compile = function (node, root) {
256265 directive = Directive . parse ( 'with' , withKey || '' , compiler , node )
257266 if ( directive ) {
258267 directive . Ctor = componentCtor
259- compiler . bindDirective ( directive )
268+ compiler . deferred . push ( directive )
260269 }
261270
262271 } else {
0 commit comments