Skip to content

Commit b28c662

Browse files
committed
fix(compile): assign controller return value to correct ctrls
Fixes angular#12029
1 parent 41385f0 commit b28c662

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

src/ng/compile.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -1983,9 +1983,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
19831983
var scopeDirective = newIsolateScopeDirective || newScopeDirective;
19841984
var bindings;
19851985
var controllerForBindings;
1986+
var scopeController;
19861987
if (scopeDirective && elementControllers[scopeDirective.name]) {
19871988
bindings = scopeDirective.$$bindings.bindToController;
1988-
controller = elementControllers[scopeDirective.name];
1989+
controller = scopeController = elementControllers[scopeDirective.name];
19891990

19901991
if (controller && controller.identifier && bindings) {
19911992
controllerForBindings = controller;
@@ -1997,9 +1998,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
19971998
for (i in elementControllers) {
19981999
controller = elementControllers[i];
19992000
var controllerResult = controller();
2001+
20002002
if (controllerResult !== controller.instance) {
20012003
controller.instance = controllerResult;
2002-
$element.data('$' + directive.name + 'Controller', controllerResult);
2004+
var name = controller === scopeController ? scopeDirective.name : directive.name;
2005+
$element.data('$' + name + 'Controller', controllerResult);
20032006
if (controller === controllerForBindings) {
20042007
// Remove and re-install bindToController bindings
20052008
thisLinkFn.$$destroyBindings();

test/ng/compileSpec.js

+29
Original file line numberDiff line numberDiff line change
@@ -4573,6 +4573,35 @@ describe('$compile', function() {
45734573
});
45744574

45754575

4576+
it('should not confuse ngController and directive controller', function() {
4577+
var ngController, directiveController;
4578+
module(function($controllerProvider) {
4579+
$controllerProvider.register('myCtrl', function() {
4580+
return ngController = {
4581+
foo: 'bar'
4582+
};
4583+
});
4584+
4585+
directive('myDirective', function(log) {
4586+
return {
4587+
controller: function($scope) {
4588+
return directiveController = {
4589+
baz: 'val'
4590+
};
4591+
}
4592+
};
4593+
});
4594+
4595+
});
4596+
4597+
inject(function(log, $compile, $rootScope) {
4598+
element = $compile('<my-directive ng-controller="myCtrl"></my-directive>')($rootScope);
4599+
expect(element.data('$ngControllerController')).toBe(ngController);
4600+
expect(element.data('$myDirectiveController')).toBe(directiveController);
4601+
});
4602+
});
4603+
4604+
45764605
it('should get required parent controller', function() {
45774606
module(function() {
45784607
directive('nested', function(log) {

0 commit comments

Comments
 (0)