From 8f0dcbab804180828d6859b1340c86cf161209fb Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Wed, 23 Mar 2011 09:33:29 -0700 Subject: feat(scope): new and improved scope implementation - Speed improvements (about 4x on flush phase) - Memory improvements (uses no function closures) - Break $eval into $apply, $dispatch, $flush - Introduced $watch and $observe Breaks angular.equals() use === instead of == Breaks angular.scope() does not take parent as first argument Breaks scope.$watch() takes scope as first argument Breaks scope.$set(), scope.$get are removed Breaks scope.$config is removed Breaks $route.onChange callback has not "this" bounded --- test/directivesSpec.js | 69 ++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 30 deletions(-) (limited to 'test/directivesSpec.js') diff --git a/test/directivesSpec.js b/test/directivesSpec.js index 22d3c84b..a05861ae 100644 --- a/test/directivesSpec.js +++ b/test/directivesSpec.js @@ -22,8 +22,9 @@ describe("directive", function(){ it("should ng:eval", function() { var scope = compile('
'); + scope.$flush(); expect(scope.a).toEqual(1); - scope.$eval(); + scope.$flush(); expect(scope.a).toEqual(2); }); @@ -32,7 +33,7 @@ describe("directive", function(){ var scope = compile('
'); expect(element.text()).toEqual(''); scope.a = 'misko'; - scope.$eval(); + scope.$flush(); expect(element.hasClass('ng-binding')).toEqual(true); expect(element.text()).toEqual('misko'); }); @@ -40,24 +41,24 @@ describe("directive", function(){ it('should set text to blank if undefined', function() { var scope = compile('
'); scope.a = 'misko'; - scope.$eval(); + scope.$flush(); expect(element.text()).toEqual('misko'); scope.a = undefined; - scope.$eval(); + scope.$flush(); expect(element.text()).toEqual(''); }); it('should set html', function() { var scope = compile('
'); scope.html = '
hello
'; - scope.$eval(); + scope.$flush(); expect(lowercase(element.html())).toEqual('
hello
'); }); it('should set unsafe html', function() { var scope = compile('
'); scope.html = '
hello
'; - scope.$eval(); + scope.$flush(); expect(lowercase(element.html())).toEqual('
hello
'); }); @@ -66,7 +67,7 @@ describe("directive", function(){ return jqLite('hello'); }; var scope = compile('
'); - scope.$eval(); + scope.$flush(); expect(lowercase(element.html())).toEqual('hello'); }); @@ -76,12 +77,14 @@ describe("directive", function(){ return 'HELLO'; }; var scope = compile('
before
after
'); + scope.$flush(); expect(sortedHtml(scope.$element)).toEqual('
before
HELLO
after
'); }); it('should suppress rendering of falsy values', function(){ var scope = compile('
{{ null }}{{ undefined }}{{ "" }}-{{ 0 }}{{ false }}
'); + scope.$flush(); expect(scope.$element.text()).toEqual('-0false'); }); @@ -90,8 +93,8 @@ describe("directive", function(){ describe('ng:bind-template', function(){ it('should ng:bind-template', function() { var scope = compile('
'); - scope.$set('name', 'Misko'); - scope.$eval(); + scope.name = 'Misko'; + scope.$flush(); expect(element.hasClass('ng-binding')).toEqual(true); expect(element.text()).toEqual('Hello Misko!'); }); @@ -103,6 +106,7 @@ describe("directive", function(){ return text; }; var scope = compile('
beforeINNERafter
'); + scope.$flush(); expect(scope.$element.text()).toEqual("beforeHELLOafter"); expect(innerText).toEqual('INNER'); }); @@ -112,12 +116,14 @@ describe("directive", function(){ describe('ng:bind-attr', function(){ it('should bind attributes', function(){ var scope = compile('
'); + scope.$flush(); expect(element.attr('src')).toEqual('http://localhost/mysrc'); expect(element.attr('alt')).toEqual('myalt'); }); it('should not pretty print JSON in attributes', function(){ var scope = compile('{{ {a:1} }}'); + scope.$flush(); expect(element.attr('alt')).toEqual('{"a":1}'); }); }); @@ -132,7 +138,7 @@ describe("directive", function(){ scope.disabled = true; scope.readonly = true; scope.checked = true; - scope.$eval(); + scope.$flush(); expect(input.disabled).toEqual(true); expect(input.readOnly).toEqual(true); @@ -142,16 +148,16 @@ describe("directive", function(){ describe('ng:click', function(){ it('should get called on a click', function(){ var scope = compile('
'); - scope.$eval(); - expect(scope.$get('clicked')).toBeFalsy(); + scope.$flush(); + expect(scope.clicked).toBeFalsy(); browserTrigger(element, 'click'); - expect(scope.$get('clicked')).toEqual(true); + expect(scope.clicked).toEqual(true); }); it('should stop event propagation', function() { var scope = compile('
'); - scope.$eval(); + scope.$flush(); expect(scope.outer).not.toBeDefined(); expect(scope.inner).not.toBeDefined(); @@ -169,7 +175,7 @@ describe("directive", function(){ var scope = compile('
' + '' + '
'); - scope.$eval(); + scope.$flush(); expect(scope.submitted).not.toBeDefined(); browserTrigger(element.children()[0]); @@ -177,23 +183,22 @@ describe("directive", function(){ }); }); - describe('ng:class', function() { it('should add new and remove old classes dynamically', function() { var scope = compile('
'); scope.dynClass = 'A'; - scope.$eval(); + scope.$flush(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(true); scope.dynClass = 'B'; - scope.$eval(); + scope.$flush(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(false); expect(element.hasClass('B')).toBe(true); delete scope.dynClass; - scope.$eval(); + scope.$flush(); expect(element.hasClass('existing')).toBe(true); expect(element.hasClass('A')).toBe(false); expect(element.hasClass('B')).toBe(false); @@ -201,7 +206,7 @@ describe("directive", function(){ it('should support adding multiple classes', function(){ var scope = compile('
'); - scope.$eval(); + scope.$flush(); expect(element.hasClass('existing')).toBeTruthy(); expect(element.hasClass('A')).toBeTruthy(); expect(element.hasClass('B')).toBeTruthy(); @@ -211,7 +216,7 @@ describe("directive", function(){ it('should ng:class odd/even', function(){ var scope = compile('