aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorIgor Minar2012-10-25 00:33:36 -0700
committerIgor Minar2012-10-29 17:46:44 -0700
commitfc115bfd0d18017f4bcef1e39fb22d97a98f8ab1 (patch)
tree398b421ea89a38185a83770da640daa77b7d5def /test
parentbca1604c12262b66ce3b8004994fb4841fb8b87d (diff)
downloadangular.js-fc115bfd0d18017f4bcef1e39fb22d97a98f8ab1.tar.bz2
fix($compile): prevent double attr interpolation w/ templateUrl
This fixes the issue that caused two attr interpolation observers to be registered for the same attribute as a result of isolate scope definition with attr (@) property for this attribute. Duplicate observers would then fight with each other updating the model. The issue occured only when this directive was used in a repeater because that's when we clone the template node which caused the two observers to point to two different sets of $attr instances. Closes #1166, #836
Diffstat (limited to 'test')
-rw-r--r--test/ng/compileSpec.js33
1 files changed, 33 insertions, 0 deletions
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index b5e4c450..75af0181 100644
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -1048,6 +1048,39 @@ describe('$compile', function() {
expect($exceptionHandler.errors).toEqual([]);
});
});
+
+
+ it('should resume delayed compilation without duplicates when in a repeater', function() {
+ // this is a test for a regression
+ // scope creation, isolate watcher setup, controller instantiation, etc should happen
+ // only once even if we are dealing with delayed compilation of a node due to templateUrl
+ // and the template node is in a repeater
+
+ var controllerSpy = jasmine.createSpy('controller');
+
+ module(function($compileProvider) {
+ $compileProvider.directive('delayed', valueFn({
+ controller: controllerSpy,
+ templateUrl: 'delayed.html',
+ scope: {
+ title: '@'
+ }
+ }));
+ });
+
+ inject(function($templateCache, $compile, $rootScope) {
+ $rootScope.coolTitle = 'boom!';
+ $templateCache.put('delayed.html', '<div>{{title}}</div>');
+ element = $compile(
+ '<div><div ng-repeat="i in [1,2]"><div delayed title="{{coolTitle + i}}"></div>|</div></div>'
+ )($rootScope);
+
+ $rootScope.$apply();
+
+ expect(controllerSpy.callCount).toBe(2);
+ expect(element.text()).toBe('boom!1|boom!2|');
+ });
+ });
});