aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/compile.js13
-rw-r--r--test/ng/compileSpec.js54
2 files changed, 66 insertions, 1 deletions
diff --git a/src/ng/compile.js b/src/ng/compile.js
index 17f49d68..61e88df6 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -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);
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index 74eaec8a..1c4a1d30 100644
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -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: {},
@@ -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>');