aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/compiler.js6
-rw-r--r--test/ng/compilerSpec.js43
2 files changed, 34 insertions, 15 deletions
diff --git a/src/ng/compiler.js b/src/ng/compiler.js
index 4a95eefb..bbbcedb7 100644
--- a/src/ng/compiler.js
+++ b/src/ng/compiler.js
@@ -350,7 +350,7 @@ function $CompileProvider($provide) {
var linkingFns = [],
directiveLinkingFn, childLinkingFn, directives, attrs, linkingFnFound;
- for(var i = 0, ii = nodeList.length; i < ii; i++) {
+ for(var i = 0; i < nodeList.length; i++) {
attrs = new Attributes();
// we must always refer to nodeList[i] since the nodes can be replaced underneath us.
@@ -374,10 +374,6 @@ function $CompileProvider($provide) {
return linkingFnFound ? linkingFn : null;
/* nodesetLinkingFn */ function linkingFn(scope, nodeList, rootElement, boundTranscludeFn) {
- if (linkingFns.length != nodeList.length * 2) {
- throw Error('Template changed structure!');
- }
-
var childLinkingFn, directiveLinkingFn, node, childScope, childTransclusionFn;
for(var i=0, n=0, ii=linkingFns.length; i<ii; n++) {
diff --git a/test/ng/compilerSpec.js b/test/ng/compilerSpec.js
index 55479396..f9d8d301 100644
--- a/test/ng/compilerSpec.js
+++ b/test/ng/compilerSpec.js
@@ -242,16 +242,39 @@ describe('$compile', function() {
});
- it('should prevent changing of structure', inject(
- function($compile, $rootScope){
- element = jqLite("<div><div log></div></div>");
- var linkFn = $compile(element);
- element.append("<div></div>");
- expect(function() {
- linkFn($rootScope);
- }).toThrow('Template changed structure!');
- }
- ));
+ it('should allow changing the template structure after the current node', function() {
+ module(function($compileProvider){
+ $compileProvider.directive('after', valueFn({
+ compile: function(element) {
+ element.after('<span log>B</span>');
+ }
+ }));
+ });
+ inject(function($compile, $rootScope, log){
+ element = jqLite("<div><div after>A</div></div>");
+ $compile(element)($rootScope);
+ expect(element.text()).toBe('AB');
+ expect(log).toEqual('LOG');
+ });
+ });
+
+
+ it('should allow changing the template structure after the current node inside ngRepeat', function() {
+ module(function($compileProvider){
+ $compileProvider.directive('after', valueFn({
+ compile: function(element) {
+ element.after('<span log>B</span>');
+ }
+ }));
+ });
+ inject(function($compile, $rootScope, log){
+ element = jqLite('<div><div ng-repeat="i in [1,2]"><div after>A</div></div></div>');
+ $compile(element)($rootScope);
+ $rootScope.$digest();
+ expect(element.text()).toBe('ABAB');
+ expect(log).toEqual('LOG; LOG');
+ });
+ });
});
describe('compiler control', function() {