From 27e9340b3c25b512e45213b39811098d07e12e3b Mon Sep 17 00:00:00 2001
From: Igor Minar
Date: Thu, 7 Nov 2013 16:19:03 -0800
Subject: feat(jqLite): expose isolateScope() getter similar to scope()
See doc update in the diff for more info.
BREAKING CHANGE: jqLite#scope() does not return the isolate scope on the element
that triggered directive with isolate scope. Use jqLite#isolateScope() instead.
---
test/jqLiteSpec.js | 34 ++++++++++++++
test/ng/compileSpec.js | 120 ++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 152 insertions(+), 2 deletions(-)
(limited to 'test')
diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js
index 24920273..02a17df8 100644
--- a/test/jqLiteSpec.js
+++ b/test/jqLiteSpec.js
@@ -151,6 +151,13 @@ describe('jqLite', function() {
dealoc(element);
});
+ it('should retrieve isolate scope attached to the current element', function() {
+ var element = jqLite('foo');
+ element.data('$isolateScope', scope);
+ expect(element.isolateScope()).toBe(scope);
+ dealoc(element);
+ });
+
it('should retrieve scope attached to the html element if its requested on the document',
function() {
var doc = jqLite(document),
@@ -182,6 +189,33 @@ describe('jqLite', function() {
});
+ describe('isolateScope', function() {
+
+ it('should retrieve isolate scope attached to the current element', function() {
+ var element = jqLite('foo');
+ element.data('$isolateScope', scope);
+ expect(element.isolateScope()).toBe(scope);
+ dealoc(element);
+ });
+
+
+ it('should not walk up the dom to find scope', function() {
+ var element = jqLite('
deep deep
');
+ var deepChild = jqLite(element[0].getElementsByTagName('b')[0]);
+ element.data('$isolateScope', scope);
+ expect(deepChild.isolateScope()).toBeUndefined();
+ dealoc(element);
+ });
+
+
+ it('should return undefined when no scope was found', function() {
+ var element = jqLite('');
+ expect(element.isolateScope()).toBeFalsy();
+ dealoc(element);
+ });
+ });
+
+
describe('injector', function() {
it('should retrieve injector attached to the current element or its parent', function() {
var template = jqLite('
'),
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index a61d50f2..5bdbad42 100755
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -1375,7 +1375,7 @@ describe('$compile', function() {
return function (scope, element) {
iscope = scope;
log(scope.$id);
- expect(element.data('$isolateScope')).toBe(scope);
+ expect(element.data('$isolateScopeNoTemplate')).toBe(scope);
};
}
};
@@ -1522,7 +1522,7 @@ describe('$compile', function() {
);
- it('should allow more one new scope directives per element, but directives should share' +
+ it('should allow more than one new scope directives per element, but directives should share' +
'the scope', inject(
function($rootScope, $compile, log) {
element = $compile('')($rootScope);
@@ -1554,6 +1554,120 @@ describe('$compile', function() {
expect(log).toEqual('002');
})
);
+
+
+ describe('scope()/isolate() scope getters', function() {
+
+ describe('with no directives', function() {
+
+ it('should return the scope of the parent node', inject(
+ function($rootScope, $compile) {
+ element = $compile('')($rootScope);
+ expect(element.scope()).toBe($rootScope);
+ })
+ );
+ });
+
+
+ describe('with new scope directives', function() {
+
+ it('should return the new scope at the directive element', inject(
+ function($rootScope, $compile) {
+ element = $compile('')($rootScope);
+ expect(element.scope().$parent).toBe($rootScope);
+ })
+ );
+
+
+ it('should return the new scope for children in the original template', inject(
+ function($rootScope, $compile) {
+ element = $compile('
')($rootScope);
+ expect(element.find('a').scope().$parent).toBe($rootScope);
+ })
+ );
+
+
+ it('should return the new scope for children in the directive template', inject(
+ function($rootScope, $compile, $httpBackend) {
+ $httpBackend.expect('GET', 'tscope.html').respond('');
+ element = $compile('')($rootScope);
+ $httpBackend.flush();
+ expect(element.find('a').scope().$parent).toBe($rootScope);
+ })
+ );
+ });
+
+
+ describe('with isolate scope directives', function() {
+
+ it('should return the root scope for directives at the root element', inject(
+ function($rootScope, $compile) {
+ element = $compile('')($rootScope);
+ expect(element.scope()).toBe($rootScope);
+ })
+ );
+
+
+ it('should return the non-isolate scope at the directive element', inject(
+ function($rootScope, $compile) {
+ var directiveElement;
+ element = $compile('
')($rootScope);
+ directiveElement = element.children();
+ expect(directiveElement.scope()).toBe($rootScope);
+ expect(directiveElement.isolateScope().$parent).toBe($rootScope);
+ })
+ );
+
+
+ it('should return the isolate scope for children in the original template', inject(
+ function($rootScope, $compile) {
+ element = $compile('
')($rootScope);
+ expect(element.find('a').scope()).toBe($rootScope); //xx
+ })
+ );
+
+
+ it('should return the isolate scope for children in directive template', inject(
+ function($rootScope, $compile, $httpBackend) {
+ $httpBackend.expect('GET', 'tiscope.html').respond('');
+ element = $compile('')($rootScope);
+ expect(element.isolateScope()).toBeUndefined(); // this is the current behavior, not desired feature
+ $httpBackend.flush();
+ expect(element.find('a').scope()).toBe(element.isolateScope());
+ expect(element.isolateScope()).not.toBe($rootScope);
+ })
+ );
+ });
+
+
+ describe('with isolate scope directives and directives that manually create a new scope', function() {
+
+ it('should return the new scope at the directive element', inject(
+ function($rootScope, $compile) {
+ var directiveElement;
+ element = $compile('