From e46100f7097d9a8f174bdb9e15d4c6098395c3f2 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Fri, 24 May 2013 12:41:38 -0700 Subject: feat($compile): support multi-element directive By appending directive-start and directive-end to a directive it is now possible to have the directive act on a group of elements. It is now possible to iterate over multiple elements like so: I get repeatedI also get repeated
--- test/jqLiteSpec.js | 12 +++-- test/ng/compileSpec.js | 125 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 4 deletions(-) (limited to 'test') diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 1ebe6ad4..70c18d35 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -56,6 +56,9 @@ describe('jqLite', function() { it('should allow construction with html', function() { var nodes = jqLite('
1
2'); + expect(nodes[0].parentNode).toBeDefined(); + expect(nodes[0].parentNode.nodeType).toBe(11); /** Document Fragment **/; + expect(nodes[0].parentNode).toBe(nodes[1].parentNode); expect(nodes.length).toEqual(2); expect(nodes[0].innerHTML).toEqual('1'); expect(nodes[1].innerHTML).toEqual('2'); @@ -644,12 +647,13 @@ describe('jqLite', function() { it('should read/write value', function() { - var element = jqLite('
abc
'); - expect(element.length).toEqual(1); - expect(element[0].innerHTML).toEqual('abc'); + var element = jqLite('
ab
c'); + expect(element.length).toEqual(2); + expect(element[0].innerHTML).toEqual('ab'); + expect(element[1].innerHTML).toEqual('c'); expect(element.text()).toEqual('abc'); expect(element.text('xyz') == element).toBeTruthy(); - expect(element.text()).toEqual('xyz'); + expect(element.text()).toEqual('xyzxyz'); }); }); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index bf3d0b77..95b2ab72 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -2718,4 +2718,129 @@ describe('$compile', function() { expect(element.attr('test4')).toBe('Misko'); })); }); + + + describe('multi-element directive', function() { + it('should group on link function', inject(function($compile, $rootScope) { + $rootScope.show = false; + element = $compile( + '
' + + '' + + '' + + '
')($rootScope); + $rootScope.$digest(); + var spans = element.find('span'); + expect(spans.eq(0).css('display')).toBe('none'); + expect(spans.eq(1).css('display')).toBe('none'); + })); + + + it('should group on compile function', inject(function($compile, $rootScope) { + $rootScope.show = false; + element = $compile( + '
' + + '{{i}}A' + + '{{i}}B;' + + '
')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('1A1B;2A2B;'); + })); + + + it('should group on $root compile function', inject(function($compile, $rootScope) { + $rootScope.show = false; + element = $compile( + '
' + + '{{i}}A' + + '{{i}}B;' + + '
')($rootScope); + $rootScope.$digest(); + element = jqLite(element[0].parentNode.childNodes); // reset because repeater is top level. + expect(element.text()).toEqual('1A1B;2A2B;'); + })); + + + it('should group on nested groups', inject(function($compile, $rootScope) { + $rootScope.show = false; + element = $compile( + '
' + + '
{{i}}A
' + + '' + + '' + + '
{{i}}B;
' + + '
')($rootScope); + $rootScope.$digest(); + element = jqLite(element[0].parentNode.childNodes); // reset because repeater is top level. + expect(element.text()).toEqual('1A..1B;2A..2B;'); + })); + + + it('should group on nested groups', inject(function($compile, $rootScope) { + $rootScope.show = false; + element = $compile( + '
' + + '
{{i}}(
' + + '{{j}}-' + + '{{j}}' + + '
){{i}};
' + + '
')($rootScope); + $rootScope.$digest(); + element = jqLite(element[0].parentNode.childNodes); // reset because repeater is top level. + expect(element.text()).toEqual('1(2-23-3)1;2(2-23-3)2;'); + })); + + + it('should throw error if unterminated', function () { + module(function($compileProvider) { + $compileProvider.directive('foo', function() { + return { + }; + }); + }); + inject(function($compile, $rootScope) { + expect(function() { + element = $compile( + '
' + + '' + + '
'); + }).toThrow("[NgErr51] Unterminated attribute, found 'foo-start' but no matching 'foo-end' found."); + }); + }); + + + it('should throw error if unterminated', function () { + module(function($compileProvider) { + $compileProvider.directive('foo', function() { + return { + }; + }); + }); + inject(function($compile, $rootScope) { + expect(function() { + element = $compile( + '
' + + '' + + '
'); + }).toThrow("[NgErr51] Unterminated attribute, found 'foo-start' but no matching 'foo-end' found."); + }); + }); + + + it('should support data- and x- prefix', inject(function($compile, $rootScope) { + $rootScope.show = false; + element = $compile( + '
' + + '' + + '' + + '' + + '' + + '
')($rootScope); + $rootScope.$digest(); + var spans = element.find('span'); + expect(spans.eq(0).css('display')).toBe('none'); + expect(spans.eq(1).css('display')).toBe('none'); + expect(spans.eq(2).css('display')).toBe('none'); + expect(spans.eq(3).css('display')).toBe('none'); + })); + }); }); -- cgit v1.2.3