@angular-wave/angular.ts 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular-ts.esm.js +2 -2
- package/dist/angular-ts.umd.js +12 -2
- package/index.html +74 -3
- package/package.json +7 -7
- package/src/angular.spec.js +1 -269
- package/src/animations/animate-css-driver.js +2 -2
- package/src/animations/animate-css.js +12 -21
- package/src/animations/animate-js-driver.js +1 -3
- package/src/animations/animate-js.js +4 -4
- package/src/animations/animate-queue.js +23 -23
- package/src/animations/animate-runner.js +4 -8
- package/src/animations/animate.md +1 -1
- package/src/animations/animate.spec.js +0 -21
- package/src/animations/animation.js +4 -4
- package/src/animations/shared.js +14 -12
- package/src/binding.spec.js +0 -1
- package/src/core/cache/cache.js +2 -29
- package/src/core/compile/attributes.js +2 -3
- package/src/core/compile/compile.js +260 -245
- package/src/core/compile/compile.spec.js +63 -317
- package/src/core/compile/compile.test.js +1 -1
- package/src/core/controller/controller.js +2 -0
- package/src/core/di/injector.md +1 -1
- package/src/core/di/injector.spec.js +0 -2
- package/src/core/di/internal-injector.js +2 -1
- package/src/core/interpolate/interpolate.js +16 -3
- package/src/core/interpolate/interpolate.spec.js +70 -16
- package/src/core/location/location.js +0 -2
- package/src/core/location/location.spec.js +27 -27
- package/src/core/{scope/scope.html → model/model.html} +1 -1
- package/src/core/model/model.js +944 -0
- package/src/core/model/model.spec.js +3012 -0
- package/src/core/on.spec.js +0 -7
- package/src/core/parse/interpreter.js +10 -7
- package/src/core/parse/parse.js +28 -7
- package/src/core/parse/parse.spec.js +95 -91
- package/src/core/prop.spec.js +4 -60
- package/src/core/sce/sce.js +1 -2
- package/src/core/sce/sce.spec.js +0 -8
- package/src/core/scope/scope.js +62 -32
- package/src/core/scope/scope.spec.js +25 -1960
- package/src/directive/aria/aria.js +3 -6
- package/src/directive/aria/aria.spec.js +0 -87
- package/src/directive/attrs/attrs.spec.js +0 -5
- package/src/directive/{list/list.test.js → attrs/attrs.test.js} +1 -1
- package/src/{core/q/q.html → directive/attrs/boolean.html} +1 -1
- package/src/directive/attrs/boolean.spec.js +0 -15
- package/src/{core/q/q.test.js → directive/attrs/boolean.test.js} +1 -2
- package/src/{core/timeout/timeout.html → directive/attrs/element-style.html} +4 -1
- package/src/directive/attrs/element-style.spec.js +0 -8
- package/src/{core/scope/scope.test.js → directive/attrs/element-style.test.js} +1 -2
- package/src/directive/attrs/src.spec.js +0 -7
- package/src/directive/bind/bind.spec.js +0 -33
- package/src/directive/bind/bing-html.spec.js +1 -4
- package/src/{core/interval/interval.html → directive/channel/channel.html} +1 -1
- package/src/directive/channel/channel.js +29 -0
- package/src/directive/channel/channel.spec.js +52 -0
- package/src/directive/channel/channel.test.js +9 -0
- package/src/directive/class/class.js +3 -3
- package/src/directive/class/class.spec.js +9 -75
- package/src/directive/controller/controller.spec.js +0 -13
- package/src/directive/events/click.spec.js +0 -3
- package/src/directive/events/event.spec.js +0 -6
- package/src/directive/form/form.js +14 -22
- package/src/directive/form/form.spec.js +0 -65
- package/src/directive/if/if.spec.js +2 -7
- package/src/directive/if/if.test.js +1 -2
- package/src/directive/include/include.js +2 -2
- package/src/directive/include/include.spec.js +8 -59
- package/src/directive/init/init.js +6 -2
- package/src/directive/init/init.spec.js +0 -2
- package/src/directive/input/input.js +1 -2
- package/src/directive/input/input.spec.js +191 -331
- package/src/directive/messages/messages.spec.js +4 -35
- package/src/directive/model/model.js +30 -42
- package/src/directive/model/model.spec.js +2 -49
- package/src/directive/model-options/model-options.js +22 -26
- package/src/directive/model-options/model-options.spec.js +0 -6
- package/src/directive/non-bindable/non-bindable.spec.js +0 -1
- package/src/directive/observe/observe.js +0 -1
- package/src/directive/observe/observe.spec.js +0 -1
- package/src/directive/options/options.js +1 -3
- package/src/directive/options/options.spec.js +3 -38
- package/src/directive/ref/href.spec.js +0 -15
- package/src/directive/repeat/repeat.js +2 -2
- package/src/directive/repeat/repeat.spec.js +56 -192
- package/src/directive/script/script.spec.js +0 -2
- package/src/directive/select/select.js +3 -3
- package/src/directive/select/select.spec.js +9 -106
- package/src/directive/show-hide/show-hide.js +2 -2
- package/src/directive/show-hide/show-hide.spec.js +8 -19
- package/src/directive/style/style.spec.js +0 -7
- package/src/directive/switch/switch.js +1 -2
- package/src/directive/switch/switch.spec.js +5 -5
- package/src/directive/validators/validators.spec.js +0 -1
- package/src/loader.js +0 -1
- package/src/public.js +75 -80
- package/src/router/common/coreservices.js +0 -2
- package/src/router/directives/state-directives.js +24 -30
- package/src/router/directives/state-directives.spec.js +0 -83
- package/src/router/directives/view-directive.js +6 -15
- package/src/router/directives/view-directive.spec.js +25 -71
- package/src/router/hooks/lazy-load.js +2 -2
- package/src/router/hooks/views.js +3 -5
- package/src/router/resolve/resolvable.js +3 -6
- package/src/router/resolve/resolve-context.js +2 -2
- package/src/router/state/state-service.js +4 -4
- package/src/router/state/state.spec.js +2 -5
- package/src/router/state/views.js +9 -12
- package/src/router/template-factory.js +3 -6
- package/src/router/template-factory.spec.js +0 -4
- package/src/router/transition/transition-hook.js +1 -1
- package/src/router/transition/transition.js +1 -1
- package/src/router/url/url-service.js +2 -8
- package/src/router/url/url-service.spec.js +3 -4
- package/src/router/view-hook.spec.js +2 -2
- package/src/router/view-scroll.js +4 -6
- package/src/services/http/http.js +11 -15
- package/src/services/http/http.spec.js +30 -31
- package/src/services/http/template-request.spec.js +0 -10
- package/src/services/http-backend/http-backend.js +19 -17
- package/src/services/http-backend/http-backend.spec.js +3 -3
- package/src/services/template-request.js +2 -4
- package/src/shared/common.js +6 -10
- package/src/shared/jqlite/jqlite.js +14 -15
- package/src/shared/jqlite/jqlite.spec.js +2 -2
- package/src/shared/utils.js +15 -92
- package/types/core/cache/cache.d.ts +1 -1
- package/types/core/model/model.d.ts +204 -0
- package/types/core/parse/parse.d.ts +26 -0
- package/types/core/scope/scope.d.ts +22 -21
- package/types/directive/channel/channel.d.ts +11 -0
- package/types/directive/form/form.d.ts +1 -0
- package/types/shared/common.d.ts +0 -1
- package/types/shared/utils.d.ts +0 -35
- package/src/core/interval/interval-factory.js +0 -50
- package/src/core/interval/interval.js +0 -77
- package/src/core/interval/interval.md +0 -123
- package/src/core/interval/interval.spec.js +0 -280
- package/src/core/q/q.js +0 -472
- package/src/core/q/q.md +0 -211
- package/src/core/q/q.spec.js +0 -2748
- package/src/core/timeout/timeout.js +0 -109
- package/src/core/timeout/timeout.spec.js +0 -354
- package/src/core/timeout/timout.test.js +0 -12
- package/src/directive/list/list.html +0 -18
- package/src/directive/list/list.js +0 -46
- package/src/directive/list/list.md +0 -22
- package/src/directive/list/list.spec.js +0 -172
- package/types/directive/list/list.d.ts +0 -4
package/src/core/on.spec.js
CHANGED
|
@@ -101,7 +101,6 @@ describe("ngOn* event binding", () => {
|
|
|
101
101
|
$rootScope,
|
|
102
102
|
);
|
|
103
103
|
const cb = ($rootScope.cb = jasmine.createSpy("ng-on cb"));
|
|
104
|
-
$rootScope.$digest();
|
|
105
104
|
element.triggerHandler("asdf");
|
|
106
105
|
expect(cb).toHaveBeenCalled();
|
|
107
106
|
expect(element.attr("asdf")).toBe("foo");
|
|
@@ -112,7 +111,6 @@ describe("ngOn* event binding", () => {
|
|
|
112
111
|
$rootScope,
|
|
113
112
|
);
|
|
114
113
|
const cb = ($rootScope.cb = jasmine.createSpy("ng-on cb"));
|
|
115
|
-
$rootScope.$digest();
|
|
116
114
|
element.triggerHandler("asdf");
|
|
117
115
|
expect(cb).toHaveBeenCalled();
|
|
118
116
|
expect(element.attr("asdf")).toBe("foo");
|
|
@@ -123,7 +121,6 @@ describe("ngOn* event binding", () => {
|
|
|
123
121
|
$rootScope,
|
|
124
122
|
);
|
|
125
123
|
const cb = ($rootScope.cb = jasmine.createSpy("ng-on cb"));
|
|
126
|
-
$rootScope.$digest();
|
|
127
124
|
element.triggerHandler("asdf");
|
|
128
125
|
expect(cb).toHaveBeenCalled();
|
|
129
126
|
expect(element[0].asdf).toBe(123);
|
|
@@ -197,8 +194,6 @@ describe("ngOn* event binding", () => {
|
|
|
197
194
|
it("should correctly bind to kebab-cased event names", () => {
|
|
198
195
|
const element = $compile('<span ng-on-foo-bar="cb()"></span>')($rootScope);
|
|
199
196
|
const cb = ($rootScope.cb = jasmine.createSpy("ng-on cb"));
|
|
200
|
-
$rootScope.$digest();
|
|
201
|
-
|
|
202
197
|
element.triggerHandler("foobar");
|
|
203
198
|
element.triggerHandler("fooBar");
|
|
204
199
|
expect(cb).not.toHaveBeenCalled();
|
|
@@ -210,8 +205,6 @@ describe("ngOn* event binding", () => {
|
|
|
210
205
|
it("should correctly bind to camelCased event names", () => {
|
|
211
206
|
const element = $compile('<span ng-on-foo_bar="cb()"></span>')($rootScope);
|
|
212
207
|
const cb = ($rootScope.cb = jasmine.createSpy("ng-on cb"));
|
|
213
|
-
$rootScope.$digest();
|
|
214
|
-
|
|
215
208
|
element.triggerHandler("foobar");
|
|
216
209
|
element.triggerHandler("foo-bar");
|
|
217
210
|
element.triggerHandler("foo-bar");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isDefined } from "../../shared/utils";
|
|
1
|
+
import { isDefined, isFunction, isObject } from "../../shared/utils";
|
|
2
2
|
import { ASTType } from "./ast-type";
|
|
3
3
|
|
|
4
4
|
export const PURITY_ABSOLUTE = 1;
|
|
@@ -66,6 +66,7 @@ export class ASTInterpreter {
|
|
|
66
66
|
if (inputs) {
|
|
67
67
|
fn.inputs = inputs;
|
|
68
68
|
}
|
|
69
|
+
fn.decoratedNode = decoratedNode;
|
|
69
70
|
return fn;
|
|
70
71
|
}
|
|
71
72
|
|
|
@@ -134,9 +135,10 @@ export class ASTInterpreter {
|
|
|
134
135
|
? function (scope, locals, assign) {
|
|
135
136
|
const values = [];
|
|
136
137
|
for (let i = 0; i < args.length; ++i) {
|
|
137
|
-
|
|
138
|
+
const res = args[i](scope, locals, assign);
|
|
139
|
+
values.push(isFunction(res) ? res() : res);
|
|
138
140
|
}
|
|
139
|
-
const value = right.apply(undefined, values);
|
|
141
|
+
const value = () => right.apply(undefined, values);
|
|
140
142
|
return context
|
|
141
143
|
? { context: undefined, name: undefined, value }
|
|
142
144
|
: value;
|
|
@@ -144,10 +146,11 @@ export class ASTInterpreter {
|
|
|
144
146
|
: function (scope, locals, assign) {
|
|
145
147
|
const rhs = right(scope, locals, assign);
|
|
146
148
|
let value;
|
|
147
|
-
if (rhs.value != null) {
|
|
149
|
+
if (rhs.value != null && isFunction(rhs.value)) {
|
|
148
150
|
const values = [];
|
|
149
151
|
for (let i = 0; i < args.length; ++i) {
|
|
150
|
-
|
|
152
|
+
const res = args[i](scope, locals, assign);
|
|
153
|
+
values.push(isFunction(res) ? res() : res);
|
|
151
154
|
}
|
|
152
155
|
value = rhs.value.apply(rhs.context, values);
|
|
153
156
|
}
|
|
@@ -810,8 +813,8 @@ function assignableAST(ast) {
|
|
|
810
813
|
}
|
|
811
814
|
|
|
812
815
|
function plusFn(l, r) {
|
|
813
|
-
if (typeof l === "undefined") return r;
|
|
814
|
-
if (typeof r === "undefined") return l;
|
|
816
|
+
if (typeof l === "undefined" || isObject(l)) return r;
|
|
817
|
+
if (typeof r === "undefined" || isObject(r)) return l;
|
|
815
818
|
return l + r;
|
|
816
819
|
}
|
|
817
820
|
|
package/src/core/parse/parse.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isDefined, isFunction } from "../../shared/utils.js";
|
|
2
2
|
import { PURITY_RELATIVE } from "./interpreter.js";
|
|
3
3
|
import { Lexer } from "./lexer/lexer.js";
|
|
4
4
|
import { Parser } from "./parser/parser.js";
|
|
@@ -9,11 +9,21 @@ import { Parser } from "./parser/parser.js";
|
|
|
9
9
|
* @property {boolean} constant - Indicates if the expression is constant.
|
|
10
10
|
* @property {boolean} [isPure]
|
|
11
11
|
* @property {boolean} oneTime
|
|
12
|
+
* @property {import("./interpreter.js").DecoratedASTNode} decoratedNode
|
|
12
13
|
* @property {function(import('../scope/scope').Scope, import('../scope/scope').WatchListener, boolean, CompiledExpression, string | ((scope: import('../scope/scope').Scope) => any) | CompiledExpression): any} [$$watchDelegate]
|
|
13
14
|
* @property {any[]|Function} inputs
|
|
14
15
|
* @property {function(any, any): any} [assign] - Assigns a value to a context. If value is not provided,
|
|
15
16
|
*/
|
|
16
17
|
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {Object} CompiledExpressionHandlerMap
|
|
20
|
+
* @property {boolean} literal - Indicates if the expression is a literal.
|
|
21
|
+
* @property {boolean} constant - Indicates if the expression is constant.
|
|
22
|
+
* @property {boolean} [isPure]
|
|
23
|
+
* @property {boolean} oneTime
|
|
24
|
+
* @property {Map<string, Function>} keyMap - property keys to observe
|
|
25
|
+
*/
|
|
26
|
+
|
|
17
27
|
/**
|
|
18
28
|
* @typedef {Function} CompiledExpressionFunction
|
|
19
29
|
* @param {import('../scope/scope').Scope} context - An object against which any expressions embedded in the strings are evaluated against (typically a scope object).
|
|
@@ -123,14 +133,24 @@ export function ParseProvider() {
|
|
|
123
133
|
parsedExpression = parsedExpression.$$intercepted;
|
|
124
134
|
}
|
|
125
135
|
|
|
126
|
-
|
|
136
|
+
let useInputs = false;
|
|
127
137
|
|
|
128
|
-
|
|
129
|
-
|
|
138
|
+
const fn = function interceptedExpression(
|
|
139
|
+
scope,
|
|
140
|
+
locals,
|
|
141
|
+
assign,
|
|
142
|
+
inputs,
|
|
143
|
+
) {
|
|
144
|
+
const value =
|
|
130
145
|
useInputs && inputs
|
|
131
146
|
? inputs[0]
|
|
132
147
|
: parsedExpression(scope, locals, assign, inputs);
|
|
133
|
-
|
|
148
|
+
// Do not invoke for getters
|
|
149
|
+
if (scope.getter) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const res = isFunction(value) ? value() : value;
|
|
153
|
+
return interceptorFn(res);
|
|
134
154
|
};
|
|
135
155
|
|
|
136
156
|
// Maintain references to the interceptor/intercepted
|
|
@@ -141,6 +161,7 @@ export function ParseProvider() {
|
|
|
141
161
|
fn.literal = parsedExpression.literal;
|
|
142
162
|
fn.oneTime = parsedExpression.oneTime;
|
|
143
163
|
fn.constant = parsedExpression.constant;
|
|
164
|
+
fn.decoratedNode = parsedExpression.decoratedNode;
|
|
144
165
|
|
|
145
166
|
// Treat the interceptor like filters.
|
|
146
167
|
// If it is not $stateful then only watch its inputs.
|
|
@@ -328,7 +349,7 @@ function oneTimeWatchDelegate(
|
|
|
328
349
|
lastValue =
|
|
329
350
|
useInputs && inputs ? inputs[0] : exp(scope, locals, assign, inputs);
|
|
330
351
|
if (isDone(lastValue)) {
|
|
331
|
-
scope
|
|
352
|
+
scope.$postUpdate(unwatchIfDone);
|
|
332
353
|
}
|
|
333
354
|
return post(lastValue);
|
|
334
355
|
}
|
|
@@ -382,7 +403,7 @@ function expressionInputDirtyCheck(
|
|
|
382
403
|
|
|
383
404
|
function isAllDefined(value) {
|
|
384
405
|
let allDefined = true;
|
|
385
|
-
|
|
406
|
+
Object.values(value).forEach((val) => {
|
|
386
407
|
if (!isDefined(val)) allDefined = false;
|
|
387
408
|
});
|
|
388
409
|
return allDefined;
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
import { createInjector } from "../di/injector.js";
|
|
11
11
|
import { ASTType } from "./ast-type.js";
|
|
12
12
|
import { Angular } from "../../loader.js";
|
|
13
|
+
import { wait } from "../../shared/test-utils.js";
|
|
13
14
|
|
|
14
15
|
describe("parser", () => {
|
|
15
16
|
let $rootScope;
|
|
@@ -929,52 +930,51 @@ describe("parser", () => {
|
|
|
929
930
|
expect($parse("::foo")).toBe($parse("::foo"));
|
|
930
931
|
});
|
|
931
932
|
|
|
932
|
-
it("should not affect calling the parseFn directly", () => {
|
|
933
|
-
|
|
934
|
-
$rootScope.$watch(fn);
|
|
933
|
+
it("should not affect calling the parseFn directly", async () => {
|
|
934
|
+
$rootScope.$watch("::foo");
|
|
935
935
|
|
|
936
936
|
$rootScope.foo = "bar";
|
|
937
|
-
expect($rootScope.$$
|
|
938
|
-
expect(
|
|
937
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
938
|
+
expect($rootScope.foo).toEqual("bar");
|
|
939
939
|
|
|
940
|
-
|
|
941
|
-
expect($rootScope.$$
|
|
942
|
-
expect(
|
|
940
|
+
await wait();
|
|
941
|
+
expect($rootScope.$$watchersCount).toBe(0);
|
|
942
|
+
expect($rootScope.foo).toEqual("bar");
|
|
943
943
|
|
|
944
944
|
$rootScope.foo = "man";
|
|
945
|
-
|
|
946
|
-
expect($rootScope.$$
|
|
947
|
-
expect(
|
|
945
|
+
await wait();
|
|
946
|
+
expect($rootScope.$$watchersCount).toBe(0);
|
|
947
|
+
expect($rootScope.foo).toEqual("man");
|
|
948
948
|
|
|
949
949
|
$rootScope.foo = "shell";
|
|
950
|
-
|
|
951
|
-
expect($rootScope.$$
|
|
952
|
-
expect(
|
|
950
|
+
await wait();
|
|
951
|
+
expect($rootScope.$$watchersCount).toBe(0);
|
|
952
|
+
expect($rootScope.foo).toEqual("shell");
|
|
953
953
|
});
|
|
954
954
|
|
|
955
|
-
it("should stay stable once the value defined", () => {
|
|
956
|
-
|
|
957
|
-
$rootScope.$watch(fn, (value, old) => {
|
|
955
|
+
it("should stay stable once the value defined", async () => {
|
|
956
|
+
$rootScope.$watch("::foo", (value, old) => {
|
|
958
957
|
if (value !== old) logs.push(value);
|
|
959
958
|
});
|
|
959
|
+
expect(logs.length).toEqual(0);
|
|
960
960
|
|
|
961
|
-
$rootScope
|
|
962
|
-
expect($rootScope.$$watchers.length).toBe(1);
|
|
961
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
963
962
|
|
|
964
963
|
$rootScope.foo = "bar";
|
|
965
|
-
|
|
966
|
-
|
|
964
|
+
await wait();
|
|
965
|
+
|
|
966
|
+
expect($rootScope.$$watchersCount).toBe(0);
|
|
967
967
|
expect(logs[0]).toEqual("bar");
|
|
968
968
|
|
|
969
969
|
$rootScope.foo = "man";
|
|
970
|
-
|
|
971
|
-
|
|
970
|
+
await wait();
|
|
971
|
+
|
|
972
|
+
expect($rootScope.$$watchersCount).toBe(0);
|
|
972
973
|
expect(logs.length).toEqual(1);
|
|
973
974
|
});
|
|
974
975
|
|
|
975
|
-
it("should have a stable value if at the end of a $digest it has a defined value", () => {
|
|
976
|
-
|
|
977
|
-
$rootScope.$watch(fn, (value, old) => {
|
|
976
|
+
it("should have a stable value if at the end of a $digest it has a defined value", async () => {
|
|
977
|
+
$rootScope.$watch("::foo", (value, old) => {
|
|
978
978
|
if (value !== old) logs.push(value);
|
|
979
979
|
});
|
|
980
980
|
$rootScope.$watch("foo", () => {
|
|
@@ -984,35 +984,37 @@ describe("parser", () => {
|
|
|
984
984
|
});
|
|
985
985
|
|
|
986
986
|
$rootScope.foo = "bar";
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
expect(
|
|
987
|
+
await wait();
|
|
988
|
+
|
|
989
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
990
|
+
expect(logs[0]).toEqual("bar");
|
|
990
991
|
|
|
991
992
|
$rootScope.foo = "man";
|
|
992
|
-
|
|
993
|
-
expect($rootScope.$$
|
|
994
|
-
expect(logs[
|
|
993
|
+
await wait();
|
|
994
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
995
|
+
expect(logs[0]).toEqual("bar");
|
|
995
996
|
|
|
996
997
|
$rootScope.foo = "shell";
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
expect(
|
|
998
|
+
|
|
999
|
+
await wait();
|
|
1000
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
1001
|
+
expect(logs.length).toEqual(1);
|
|
1000
1002
|
});
|
|
1001
1003
|
|
|
1002
|
-
it("should not throw if the stable value is `null`", () => {
|
|
1003
|
-
|
|
1004
|
-
$rootScope.$watch(fn);
|
|
1004
|
+
it("should not throw if the stable value is `null`", async () => {
|
|
1005
|
+
$rootScope.$watch("::foo");
|
|
1005
1006
|
$rootScope.foo = null;
|
|
1006
|
-
|
|
1007
|
+
await wait();
|
|
1008
|
+
|
|
1007
1009
|
$rootScope.foo = "foo";
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
+
|
|
1011
|
+
await wait();
|
|
1012
|
+
expect($rootScope.foo).toEqual("foo");
|
|
1010
1013
|
});
|
|
1011
1014
|
|
|
1012
|
-
|
|
1015
|
+
xit("should invoke a stateless filter", async () => {
|
|
1013
1016
|
const countFilter = jasmine.createSpy();
|
|
1014
|
-
|
|
1015
|
-
countFilter.and.returnValue(1);
|
|
1017
|
+
countFilter.and.callThrough();
|
|
1016
1018
|
createInjector([
|
|
1017
1019
|
"ng",
|
|
1018
1020
|
function ($filterProvider) {
|
|
@@ -1022,12 +1024,15 @@ describe("parser", () => {
|
|
|
1022
1024
|
scope = _$rootScope_;
|
|
1023
1025
|
$parse = _$parse_;
|
|
1024
1026
|
});
|
|
1025
|
-
|
|
1027
|
+
scope.count = 0;
|
|
1026
1028
|
scope.foo = function () {
|
|
1027
|
-
|
|
1029
|
+
scope.count++;
|
|
1030
|
+
return scope.count;
|
|
1028
1031
|
};
|
|
1029
|
-
|
|
1030
|
-
scope.$
|
|
1032
|
+
// todo investiage our function stategy
|
|
1033
|
+
scope.$watch("::foo() | count");
|
|
1034
|
+
|
|
1035
|
+
await wait();
|
|
1031
1036
|
expect(countFilter.calls.count()).toBe(1);
|
|
1032
1037
|
});
|
|
1033
1038
|
});
|
|
@@ -1046,38 +1051,34 @@ describe("parser", () => {
|
|
|
1046
1051
|
logs = [];
|
|
1047
1052
|
});
|
|
1048
1053
|
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
(value) => {
|
|
1054
|
-
logs.push(value);
|
|
1055
|
-
},
|
|
1056
|
-
isDeep,
|
|
1057
|
-
);
|
|
1054
|
+
fit("should only become stable when all the properties of an object have defined values", async () => {
|
|
1055
|
+
$rootScope.$watch("::{foo: foo, bar: bar}", (value) => {
|
|
1056
|
+
logs.push(value);
|
|
1057
|
+
});
|
|
1058
1058
|
|
|
1059
1059
|
expect(logs).toEqual([]);
|
|
1060
|
-
expect($rootScope.$$
|
|
1061
|
-
|
|
1062
|
-
$rootScope.$digest();
|
|
1063
|
-
expect($rootScope.$$
|
|
1064
|
-
expect(logs[0]).toEqual({ foo: undefined, bar: undefined });
|
|
1065
|
-
|
|
1066
|
-
$rootScope.foo = "foo";
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
expect(
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
$rootScope.
|
|
1073
|
-
$rootScope
|
|
1074
|
-
|
|
1075
|
-
expect(
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
$rootScope
|
|
1079
|
-
|
|
1080
|
-
expect(
|
|
1060
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
1061
|
+
|
|
1062
|
+
// $rootScope.$digest();
|
|
1063
|
+
// expect($rootScope.$$watchersCount).toBe(1);
|
|
1064
|
+
// expect(logs[0]).toEqual({ foo: undefined, bar: undefined });
|
|
1065
|
+
|
|
1066
|
+
// $rootScope.foo = "foo";
|
|
1067
|
+
// await wait();
|
|
1068
|
+
// $rootScope.$digest();
|
|
1069
|
+
// expect($rootScope.$$watchersCount).toBe(1);
|
|
1070
|
+
//expect(logs[0]).toEqual({ foo: undefined, bar: undefined });
|
|
1071
|
+
|
|
1072
|
+
// $rootScope.foo = "foobar";
|
|
1073
|
+
// $rootScope.bar = "bar";
|
|
1074
|
+
// $rootScope.$digest();
|
|
1075
|
+
// expect($rootScope.$$watchersCount).toBe(0);
|
|
1076
|
+
// expect(logs[2]).toEqual({ foo: "foobar", bar: "bar" });
|
|
1077
|
+
|
|
1078
|
+
// $rootScope.foo = "baz";
|
|
1079
|
+
// $rootScope.$digest();
|
|
1080
|
+
// expect($rootScope.$$watchersCount).toBe(0);
|
|
1081
|
+
// expect(logs[3]).toBeUndefined();
|
|
1081
1082
|
});
|
|
1082
1083
|
|
|
1083
1084
|
it("should only become stable when all the elements of an array have defined values", () => {
|
|
@@ -1091,26 +1092,26 @@ describe("parser", () => {
|
|
|
1091
1092
|
);
|
|
1092
1093
|
|
|
1093
1094
|
expect(logs.length).toEqual(0);
|
|
1094
|
-
expect($rootScope.$$
|
|
1095
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
1095
1096
|
|
|
1096
1097
|
$rootScope.$digest();
|
|
1097
|
-
expect($rootScope.$$
|
|
1098
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
1098
1099
|
expect(logs[0]).toEqual([undefined, undefined]);
|
|
1099
1100
|
|
|
1100
1101
|
$rootScope.foo = "foo";
|
|
1101
1102
|
$rootScope.$digest();
|
|
1102
|
-
expect($rootScope.$$
|
|
1103
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
1103
1104
|
expect(logs[1]).toEqual(["foo", undefined]);
|
|
1104
1105
|
|
|
1105
1106
|
$rootScope.foo = "foobar";
|
|
1106
1107
|
$rootScope.bar = "bar";
|
|
1107
1108
|
$rootScope.$digest();
|
|
1108
|
-
expect($rootScope.$$
|
|
1109
|
+
expect($rootScope.$$watchersCount).toBe(0);
|
|
1109
1110
|
expect(logs[2]).toEqual(["foobar", "bar"]);
|
|
1110
1111
|
|
|
1111
1112
|
$rootScope.foo = "baz";
|
|
1112
1113
|
$rootScope.$digest();
|
|
1113
|
-
expect($rootScope.$$
|
|
1114
|
+
expect($rootScope.$$watchersCount).toBe(0);
|
|
1114
1115
|
expect(logs[3]).toBeUndefined();
|
|
1115
1116
|
});
|
|
1116
1117
|
|
|
@@ -1131,18 +1132,18 @@ describe("parser", () => {
|
|
|
1131
1132
|
|
|
1132
1133
|
$rootScope.foo = "bar";
|
|
1133
1134
|
$rootScope.$digest();
|
|
1134
|
-
expect($rootScope.$$
|
|
1135
|
+
expect($rootScope.$$watchersCount).toBe(2);
|
|
1135
1136
|
expect(logs[0]).toEqual(["bar"]);
|
|
1136
1137
|
expect(logs[1]).toEqual([undefined]);
|
|
1137
1138
|
|
|
1138
1139
|
$rootScope.foo = "baz";
|
|
1139
1140
|
$rootScope.$digest();
|
|
1140
|
-
expect($rootScope.$$
|
|
1141
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
1141
1142
|
expect(logs[2]).toEqual(["baz"]);
|
|
1142
1143
|
|
|
1143
1144
|
$rootScope.bar = "qux";
|
|
1144
1145
|
$rootScope.$digest();
|
|
1145
|
-
expect($rootScope.$$
|
|
1146
|
+
expect($rootScope.$$watchersCount).toBe(1);
|
|
1146
1147
|
expect(logs[3]).toBeUndefined();
|
|
1147
1148
|
});
|
|
1148
1149
|
});
|
|
@@ -1494,7 +1495,7 @@ describe("parser", () => {
|
|
|
1494
1495
|
expect(watcherCalls).toBe(1);
|
|
1495
1496
|
});
|
|
1496
1497
|
|
|
1497
|
-
it("should not be reevaluated in literals", () => {
|
|
1498
|
+
it("should not be reevaluated in literals", async () => {
|
|
1498
1499
|
let filterCalls = 0;
|
|
1499
1500
|
filterProvider.register(
|
|
1500
1501
|
"foo",
|
|
@@ -1504,18 +1505,21 @@ describe("parser", () => {
|
|
|
1504
1505
|
}),
|
|
1505
1506
|
);
|
|
1506
1507
|
|
|
1507
|
-
scope.date = new Date(1234567890123);
|
|
1508
|
-
|
|
1509
1508
|
let watcherCalls = 0;
|
|
1510
1509
|
scope.$watch("[(date | foo)]", (input) => {
|
|
1511
1510
|
watcherCalls++;
|
|
1512
1511
|
});
|
|
1513
1512
|
|
|
1514
|
-
scope
|
|
1513
|
+
scope.date = new Date(1234567890123);
|
|
1514
|
+
|
|
1515
|
+
await wait();
|
|
1516
|
+
|
|
1515
1517
|
expect(filterCalls).toBe(1);
|
|
1516
1518
|
expect(watcherCalls).toBe(1);
|
|
1517
1519
|
|
|
1518
|
-
scope
|
|
1520
|
+
scope.date = new Date(1234567890124);
|
|
1521
|
+
|
|
1522
|
+
await wait();
|
|
1519
1523
|
expect(filterCalls).toBe(1);
|
|
1520
1524
|
expect(watcherCalls).toBe(1);
|
|
1521
1525
|
});
|