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

Commit

Permalink
fix($compile): relax the restriction that directives can not add sibl…
Browse files Browse the repository at this point in the history
…ings

Relax the restriction that directives can not add siblings
  • Loading branch information
mhevery committed Apr 3, 2012
1 parent 15c1fe3 commit 7e86eac
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 15 deletions.
6 changes: 1 addition & 5 deletions src/ng/compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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++) {
Expand Down
43 changes: 33 additions & 10 deletions test/ng/compilerSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 7e86eac

Please sign in to comment.