Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
fix($compile): prevent duplicate directive controller instantiation
Browse files Browse the repository at this point in the history
Closes #876
  • Loading branch information
IgorMinar committed May 3, 2012
1 parent beea3a4 commit 843f762
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/ng/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -819,7 +819,9 @@ function $CompileProvider($provide) {
originalWidgetNode = tElement[0],
asyncWidgetDirective = directives.shift(),
// The fact that we have to copy and patch the directive seems wrong!
syncWidgetDirective = extend({}, asyncWidgetDirective, {templateUrl:null, transclude:null}),
syncWidgetDirective = extend({}, asyncWidgetDirective, {
controller: null, templateUrl: null, transclude: null
}),
html = tElement.html();

tElement.html('');
Expand Down
38 changes: 38 additions & 0 deletions test/ng/compileSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1692,7 +1692,45 @@ describe('$compile', function() {
element = $compile('<div c1 c2><div dep></div></div>')($rootScope);
expect(log).toEqual('dep:c1-c2');
});
});


it('should instantiate the controller just once when template/templateUrl', function() {
var syncCtrlSpy = jasmine.createSpy('sync controller'),
asyncCtrlSpy = jasmine.createSpy('async controller');

module(function($compileProvider) {
$compileProvider.directive('myDirectiveSync', valueFn({
template: '<div>Hello!</div>',
controller: syncCtrlSpy
}));
$compileProvider.directive('myDirectiveAsync', valueFn({
templateUrl: 'myDirectiveAsync.html',
controller: asyncCtrlSpy,
compile: function() {
return function() {
}
}
}));
});

inject(function($templateCache, $compile, $rootScope) {
expect(syncCtrlSpy).not.toHaveBeenCalled();
expect(asyncCtrlSpy).not.toHaveBeenCalled();

$templateCache.put('myDirectiveAsync.html', '<div>Hello!</div>');
element = $compile('<div>'+
'<span xmy-directive-sync></span>' +
'<span my-directive-async></span>' +
'</div>')($rootScope);
expect(syncCtrlSpy).not.toHaveBeenCalled();
expect(asyncCtrlSpy).not.toHaveBeenCalled();

$rootScope.$apply();

//expect(syncCtrlSpy).toHaveBeenCalledOnce();
expect(asyncCtrlSpy).toHaveBeenCalledOnce();
});
});
});

Expand Down

0 comments on commit 843f762

Please sign in to comment.