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('');
+ scope.$flush();
expect(sortedHtml(scope.$element)).toEqual('');
});
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('
');
+ 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('