diff --git a/src/ng/compile.js b/src/ng/compile.js index a071fcae56cc..e1ff022dc324 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1970,26 +1970,25 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } if (elementControllers) { // Initialize bindToController bindings for new/isolate scopes - var scopeDirective = newIsolateScopeDirective || newScopeDirective; - var bindings; - var controllerForBindings; - if (scopeDirective && elementControllers[scopeDirective.name]) { - bindings = scopeDirective.$$bindings.bindToController; - controller = elementControllers[scopeDirective.name]; - - if (controller && controller.identifier && bindings) { - controllerForBindings = controller; - thisLinkFn.$$destroyBindings = - initializeDirectiveBindings(scope, attrs, controller.instance, - bindings, scopeDirective); - } - } for (i in elementControllers) { + var scopeDirective = newIsolateScopeDirective || controllerDirectives[i]; + var bindings; + var controllerForBindings; + if (scopeDirective && elementControllers[scopeDirective.name]) { + bindings = scopeDirective.$$bindings.bindToController; + controller = elementControllers[scopeDirective.name]; + if (controller && controller.identifier && bindings) { + controllerForBindings = controller; + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controller.instance, + bindings, scopeDirective); + } + } controller = elementControllers[i]; var controllerResult = controller(); if (controllerResult !== controller.instance) { controller.instance = controllerResult; - $element.data('$' + directive.name + 'Controller', controllerResult); + $element.data('$' + controllerDirectives[i].name + 'Controller', controllerResult); if (controller === controllerForBindings) { // Remove and re-install bindToController bindings thisLinkFn.$$destroyBindings(); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index b89f1d08312c..70ea02e93332 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -4033,6 +4033,68 @@ describe('$compile', function() { }); + it('should bind to multiple directives controllers via object notation (new scope)', function() { + var controllerCalled = false; + var secondControllerCalled = false; + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register('myCtrl', function() { + expect(this.data).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.str).toBe('Hello, world!'); + expect(this.fn()).toBe('called!'); + controllerCalled = true; + }); + $controllerProvider.register('secondCtrl', function() { + expect(this.data).toEqualData({ + 'foo2': 'bar2', + 'baz2': 'biz2' + }); + expect(this.str).toBe('Hello, second world!'); + expect(this.fn()).toBe('second called!'); + secondControllerCalled = true; + }); + $compileProvider.directive('fooDir', valueFn({ + bindToController: { + 'data': '=dirData', + 'str': '@dirStr', + 'fn': '&dirFn' + }, + scope: true, + controller: 'myCtrl as myCtrl' + })); + $compileProvider.directive('barDir', valueFn({ + bindToController: { + 'data': '=barData', + 'str': '@barStr', + 'fn': '&barFn' + }, + scope: true, + controller: 'secondCtrl as secondCtrl' + })); + }); + inject(function($compile, $rootScope) { + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + $rootScope.fn2 = valueFn('second called!'); + $rootScope.whom2 = 'second world'; + $rootScope.remoteData2 = { + 'foo2': 'bar2', + 'baz2': 'biz2' + }; + element = $compile('
')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + expect(secondControllerCalled).toBe(true); + }); + }); + + it('should put controller in scope when controller identifier present but not using controllerAs', function() { var controllerCalled = false; var myCtrl;