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

Commit

Permalink
fix($compile): attach scope to the directive element when templateUrl…
Browse files Browse the repository at this point in the history
… and replace=true

We forgot to reattach the scope to the replacement element. This affected only
directives that had templateUrl and replace:true properties.

Reported on the mailing list:
https://groups.google.com/forum/?fromgroups#!topic/angular/zwjLr1msS2Y
http://jsfiddle.net/lukebayes/g9Sh9/
  • Loading branch information
IgorMinar committed May 3, 2012
1 parent bd530e2 commit 705f4bb
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/ng/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -852,13 +852,24 @@ function $CompileProvider($provide) {
linkRootElement = linkQueue.pop(),
cLinkNode = linkQueue.pop(),
scope = linkQueue.pop(),
node = templateNode;
node = templateNode,
cLinkNodeJq = jqLite(cLinkNode);

if (cLinkNode !== originalWidgetNode) {
// it was cloned therefore we have to clone as well.
node = JQLiteClone(templateNode);
replaceWith(linkRootElement, jqLite(cLinkNode), node);
}

if (replace) {
if (cLinkNodeJq.data('$scope')) {
// if the original element before replacement had a new scope, the replacement should
// get it as well
jqLite(node).data('$scope', scope);
}
dealoc(cLinkNodeJq);
}

afterWidgetLinkFn(function() {
beforeWidgetLinkFn(afterWidgetChildrenLinkFn, scope, node, rootElement, controller);
}, scope, node, rootElement, controller);
Expand Down
54 changes: 54 additions & 0 deletions test/ng/compileSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -991,6 +991,33 @@ describe('$compile', function() {
}
};
});
$compileProvider.directive('tscope' + uppercase(name), function(log) {
return {
scope: true,
restrict: 'CA',
templateUrl: 'tscope.html',
compile: function() {
return function (scope, element) {
log(scope.$id);
expect(element.data('$scope')).toBe(scope);
};
}
};
});
$compileProvider.directive('trscope' + uppercase(name), function(log) {
return {
scope: true,
replace: true,
restrict: 'CA',
templateUrl: 'trscope.html',
compile: function() {
return function (scope, element) {
log(scope.$id);
expect(element.data('$scope')).toBe(scope);
};
}
};
});
$compileProvider.directive('tiscope' + uppercase(name), function(log) {
return {
scope: {},
Expand Down Expand Up @@ -1034,6 +1061,33 @@ describe('$compile', function() {
}));


it('should allow creation of new scopes for directives with templates', inject(
function($rootScope, $compile, log, $httpBackend) {
$httpBackend.expect('GET', 'tscope.html').respond('<a log>{{name}}; scopeId: {{$id}}</a>');
element = $compile('<div><span tscope></span></div>')($rootScope);
$httpBackend.flush();
expect(log).toEqual('LOG; log-002-001; 002');
$rootScope.name = 'Jozo';
$rootScope.$apply();
expect(element.text()).toBe('Jozo; scopeId: 002');
expect(element.find('span').scope().$id).toBe('002');
}));


it('should allow creation of new scopes for replace directives with templates', inject(
function($rootScope, $compile, log, $httpBackend) {
$httpBackend.expect('GET', 'trscope.html').
respond('<p><a log>{{name}}; scopeId: {{$id}}</a></p>');
element = $compile('<div><span trscope></span></div>')($rootScope);
$httpBackend.flush();
expect(log).toEqual('LOG; log-002-001; 002');
$rootScope.name = 'Jozo';
$rootScope.$apply();
expect(element.text()).toBe('Jozo; scopeId: 002');
expect(element.find('a').scope().$id).toBe('002');
}));


it('should allow creation of new isolated scopes for directives with templates', inject(
function($rootScope, $compile, log, $httpBackend) {
$httpBackend.expect('GET', 'tiscope.html').respond('<a log></a>');
Expand Down

0 comments on commit 705f4bb

Please sign in to comment.