@angular-wave/angular.ts 0.6.3 → 0.6.5
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 +2 -2
- package/package.json +1 -1
- package/src/angular.spec.js +2 -2
- package/src/animations/animate-children-directive.js +1 -1
- package/src/animations/animate-css-driver.js +2 -2
- package/src/animations/animate-css.js +1 -1
- package/src/animations/animate-js.js +2 -2
- package/src/animations/animate-queue.js +2 -2
- package/src/animations/animate.js +2 -2
- package/src/animations/animate.spec.js +3 -3
- package/src/animations/animation.js +3 -3
- package/src/binding.spec.js +1 -1
- package/src/core/cache/cache.js +1 -1
- package/src/core/compile/attributes.js +24 -7
- package/src/core/compile/compile.js +79 -249
- package/src/core/compile/compile.md +0 -8
- package/src/core/compile/compile.spec.js +38 -640
- package/src/core/controller/controller.js +2 -2
- package/src/core/di/injector.js +1 -1
- package/src/core/di/injector.spec.js +1 -1
- package/src/core/di/internal-injector.js +2 -2
- package/src/core/di/ng-module.js +1 -1
- package/src/core/filter/filter.js +2 -2
- package/src/core/interpolate/interpolate.js +1 -1
- package/src/core/interval/interval-factory.js +1 -1
- package/src/core/interval/interval.js +1 -1
- package/src/core/location/location.js +3 -3
- package/src/core/on.spec.js +1 -1
- package/src/core/parse/interpreter.js +1 -1
- package/src/core/prop.spec.js +2 -2
- package/src/core/q/q.js +2 -2
- package/src/core/root-element.spec.js +1 -1
- package/src/core/sanitize/sanitize-uri.js +1 -1
- package/src/core/sce/sce.js +3 -3
- package/src/core/sce/sce.spec.js +1 -1
- package/src/core/scope/scope.js +3 -3
- package/src/core/scope/scope.spec.js +1 -1
- package/src/core/timeout/timeout.js +2 -2
- package/src/core/url-utils/url-utils.js +1 -1
- package/src/directive/aria/aria.js +1 -1
- package/src/directive/aria/aria.spec.js +1 -1
- package/src/directive/attrs/attrs.js +3 -3
- package/src/directive/attrs/attrs.spec.js +1 -1
- package/src/directive/attrs/boolean.spec.js +1 -1
- package/src/directive/attrs/element-style.spec.js +1 -1
- package/src/directive/attrs/src.spec.js +1 -1
- package/src/directive/bind/bind.js +1 -1
- package/src/directive/bind/bind.spec.js +1 -1
- package/src/directive/bind/bing-html.spec.js +1 -1
- package/src/directive/change/change.spec.js +1 -1
- package/src/directive/channel/channel.js +25 -7
- package/src/directive/channel/channel.spec.js +17 -0
- package/src/directive/class/class.js +1 -1
- package/src/directive/class/class.spec.js +2 -2
- package/src/directive/cloak/cloak.spec.js +1 -1
- package/src/directive/controller/controller.spec.js +2 -2
- package/src/directive/events/click.spec.js +1 -1
- package/src/directive/events/event.spec.js +1 -1
- package/src/directive/events/events.js +3 -3
- package/src/directive/form/form.js +2 -2
- package/src/directive/form/form.spec.js +1 -1
- package/src/directive/if/if.js +2 -3
- package/src/directive/if/if.md +0 -1
- package/src/directive/if/if.spec.js +2 -2
- package/src/directive/include/include.js +3 -3
- package/src/directive/include/include.spec.js +2 -2
- package/src/directive/init/init.spec.js +1 -1
- package/src/directive/input/input.js +1 -1
- package/src/directive/input/input.spec.js +1 -1
- package/src/directive/messages/messages.js +1 -1
- package/src/directive/messages/messages.spec.js +3 -3
- package/src/directive/model/model.js +7 -7
- package/src/directive/model/model.spec.js +2 -2
- package/src/directive/model-options/model-options.js +1 -1
- package/src/directive/model-options/model-options.spec.js +2 -2
- package/src/directive/non-bindable/non-bindable.spec.js +1 -1
- package/src/directive/observe/observe.spec.js +1 -1
- package/src/directive/options/options.js +6 -2
- package/src/directive/options/options.spec.js +2 -2
- package/src/directive/ref/href.spec.js +2 -2
- package/src/directive/ref/ref.js +1 -1
- package/src/directive/repeat/repeat.js +263 -255
- package/src/directive/repeat/repeat.md +0 -22
- package/src/directive/repeat/repeat.spec.js +2 -115
- package/src/directive/script/script.spec.js +1 -1
- package/src/directive/select/select.js +2 -2
- package/src/directive/select/select.spec.js +2 -2
- package/src/directive/show-hide/show-hide.js +1 -3
- package/src/directive/show-hide/show-hide.md +0 -2
- package/src/directive/show-hide/show-hide.spec.js +1 -1
- package/src/directive/style/style.spec.js +1 -1
- package/src/directive/switch/switch.js +2 -4
- package/src/directive/switch/switch.spec.js +1 -51
- package/src/directive/transclude/transclude.js +2 -2
- package/src/directive/validators/validators.js +2 -2
- package/src/directive/validators/validators.spec.js +1 -1
- package/src/filters/filter.js +1 -1
- package/src/filters/filter.spec.js +2 -2
- package/src/filters/filters.js +1 -1
- package/src/filters/filters.spec.js +1 -1
- package/src/filters/limit-to.js +1 -1
- package/src/filters/limit-to.spec.js +1 -1
- package/src/filters/order-by.js +1 -1
- package/src/index.js +3 -9
- package/src/loader.js +12 -16
- package/src/router/common/coreservices.js +1 -1
- package/src/router/common/trace.js +1 -1
- package/src/router/directives/state-directives.js +1 -1
- package/src/router/directives/state-directives.spec.js +1 -1
- package/src/router/directives/view-directive.js +2 -2
- package/src/router/directives/view-directive.spec.js +1 -1
- package/src/router/hooks/redirect-to.js +1 -1
- package/src/router/params/param-type.js +1 -1
- package/src/router/params/param-types.js +1 -1
- package/src/router/params/param.js +1 -1
- package/src/router/resolve/resolvable.js +1 -1
- package/src/router/resolve/resolve-context.js +1 -1
- package/src/router/state/state-builder.js +1 -1
- package/src/router/state/state-matcher.js +1 -1
- package/src/router/state/state-object.js +1 -1
- package/src/router/state/state-queue-manager.js +1 -1
- package/src/router/state/state-registry.js +2 -2
- package/src/router/state/state-service.js +1 -1
- package/src/router/state/state.spec.js +2 -2
- package/src/router/state/target-state.js +1 -1
- package/src/router/state/views.js +1 -1
- package/src/router/state-provider.js +1 -1
- package/src/router/template-factory.js +9 -8
- package/src/router/template-factory.spec.js +1 -1
- package/src/router/transition/hook-registry.js +1 -1
- package/src/router/transition/transition-service.js +1 -1
- package/src/router/transition/transition.js +1 -1
- package/src/router/url/url-config.js +1 -1
- package/src/router/url/url-matcher.js +2 -2
- package/src/router/url/url-rule.js +1 -1
- package/src/router/url/url-rules.js +1 -1
- package/src/router/url/url-service.js +6 -1
- package/src/router/url/url-service.spec.js +1 -1
- package/src/router/view/view.spec.js +1 -1
- package/src/router/view-hook.spec.js +1 -1
- package/src/router/view-scroll.spec.js +1 -1
- package/src/services/anchor-scroll.js +1 -1
- package/src/services/browser.js +2 -2
- package/src/services/cookie-reader.js +1 -1
- package/src/services/http/http.js +3 -3
- package/src/services/http/http.spec.js +1 -1
- package/src/services/http-backend/http-backend.js +1 -1
- package/src/services/log.js +1 -1
- package/src/services/template-request.js +2 -2
- package/src/shared/common.js +1 -1
- package/src/shared/jqlite/jqlite.js +9 -9
- package/src/shared/jqlite/jqlite.spec.js +11 -11
- package/src/shared/min-err.spec.js +6 -1
- package/src/shared/predicates.js +1 -1
- package/src/shared/strings.js +1 -1
- package/src/shared/test-utils.js +1 -1
- package/src/shared/utils.js +1 -1
- package/src/shared/utils.spec.js +1 -1
- package/src/types.js +0 -2
- package/types/animations/animate-css-driver.d.ts +1 -1
- package/types/animations/animate-js.d.ts +1 -1
- package/types/animations/animate.d.ts +1 -1
- package/types/animations/animation.d.ts +1 -1
- package/types/core/cache/cache.d.ts +1 -1
- package/types/core/compile/attributes.d.ts +2 -2
- package/types/core/compile/compile.d.ts +3 -2
- package/types/core/controller/controller.d.ts +1 -1
- package/types/core/filter/filter.d.ts +1 -1
- package/types/core/location/location.d.ts +1 -1
- package/types/core/q/q.d.ts +1 -1
- package/types/core/sce/sce.d.ts +1 -1
- package/types/core/scope/scope.d.ts +1 -1
- package/types/core/timeout/timeout.d.ts +1 -1
- package/types/directive/channel/channel.d.ts +13 -4
- package/types/directive/model/model.d.ts +9 -9
- package/types/directive/repeat/repeat.d.ts +10 -8
- package/types/loader.d.ts +5 -6
- package/types/router/common/coreservices.d.ts +1 -1
- package/types/router/state/state-registry.d.ts +2 -2
- package/types/router/template-factory.d.ts +2 -2
- package/types/services/browser.d.ts +1 -1
- package/types/services/http/http.d.ts +1 -1
- package/types/services/template-request.d.ts +1 -1
- package/types/shared/jqlite/jqlite.d.ts +1 -1
- package/types/shared/test-utils.d.ts +1 -1
- package/types/types.d.ts +1 -5
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { Angular } from "../../loader";
|
|
2
2
|
import { createInjector } from "../di/injector";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
dealoc,
|
|
5
|
+
JQLite,
|
|
6
|
+
getOrSetCacheData,
|
|
7
|
+
} from "../../shared/jqlite/jqlite.js";
|
|
4
8
|
import {
|
|
5
9
|
isFunction,
|
|
6
10
|
valueFn,
|
|
7
11
|
isElement,
|
|
8
12
|
getNodeName,
|
|
9
13
|
extend,
|
|
10
|
-
} from "../../shared/utils";
|
|
11
|
-
import { countChildScopes, countWatchers } from "../scope/scope";
|
|
12
|
-
import {
|
|
14
|
+
} from "../../shared/utils.js";
|
|
15
|
+
import { countChildScopes, countWatchers } from "../scope/scope.js";
|
|
16
|
+
import { Cache, EXPANDO } from "../cache/cache.js";
|
|
13
17
|
import { wait } from "../../shared/test-utils";
|
|
14
18
|
|
|
15
19
|
function isUnknownElement(el) {
|
|
@@ -689,21 +693,6 @@ describe("$compile", () => {
|
|
|
689
693
|
dealoc(element);
|
|
690
694
|
});
|
|
691
695
|
|
|
692
|
-
it("allows applying a directive to multiple elements", () => {
|
|
693
|
-
var compileEl = false;
|
|
694
|
-
registerDirectives("myDir", () => {
|
|
695
|
-
return {
|
|
696
|
-
multiElement: true,
|
|
697
|
-
compile: function (element) {
|
|
698
|
-
compileEl = element;
|
|
699
|
-
},
|
|
700
|
-
};
|
|
701
|
-
});
|
|
702
|
-
reloadModules();
|
|
703
|
-
$compile("<div my-dir-start></div><span></span><div my-dir-end></div>");
|
|
704
|
-
expect(compileEl.length).toBe(3);
|
|
705
|
-
});
|
|
706
|
-
|
|
707
696
|
it("should allow multiple directives per element", () => {
|
|
708
697
|
reloadModules();
|
|
709
698
|
var el = $(
|
|
@@ -1273,26 +1262,6 @@ describe("$compile", () => {
|
|
|
1273
1262
|
expect(givenElements[1]).toBe(el2);
|
|
1274
1263
|
});
|
|
1275
1264
|
|
|
1276
|
-
it("invokes multi-element directive link functions with whole group", () => {
|
|
1277
|
-
var givenElements;
|
|
1278
|
-
registerDirectives("myDirective", () => {
|
|
1279
|
-
return {
|
|
1280
|
-
multiElement: true,
|
|
1281
|
-
link: function (scope, element, attrs) {
|
|
1282
|
-
givenElements = element;
|
|
1283
|
-
},
|
|
1284
|
-
};
|
|
1285
|
-
});
|
|
1286
|
-
reloadModules();
|
|
1287
|
-
var el = $(
|
|
1288
|
-
"<div my-directive-start></div>" +
|
|
1289
|
-
"<p></p>" +
|
|
1290
|
-
"<div my-directive-end></div>",
|
|
1291
|
-
);
|
|
1292
|
-
$compile(el)($rootScope);
|
|
1293
|
-
expect(givenElements.length).toBe(3);
|
|
1294
|
-
});
|
|
1295
|
-
|
|
1296
1265
|
it("makes new scope for element when directive asks for it", () => {
|
|
1297
1266
|
var givenScope;
|
|
1298
1267
|
registerDirectives("myDirective", () => {
|
|
@@ -2255,26 +2224,6 @@ describe("$compile", () => {
|
|
|
2255
2224
|
expect(gotMyController instanceof MyController).toBe(true);
|
|
2256
2225
|
});
|
|
2257
2226
|
|
|
2258
|
-
it("is passed through grouped link wrapper", () => {
|
|
2259
|
-
function MyController() {}
|
|
2260
|
-
var gotMyController;
|
|
2261
|
-
myModule.directive("myDirective", () => {
|
|
2262
|
-
return {
|
|
2263
|
-
multiElement: true,
|
|
2264
|
-
scope: {},
|
|
2265
|
-
controller: MyController,
|
|
2266
|
-
link: function (scope, element, attrs, myController) {
|
|
2267
|
-
gotMyController = myController;
|
|
2268
|
-
},
|
|
2269
|
-
};
|
|
2270
|
-
});
|
|
2271
|
-
reloadModules();
|
|
2272
|
-
var el = $("<div my-directive-start></div><div my-directive-end></div>");
|
|
2273
|
-
$compile(el)($rootScope);
|
|
2274
|
-
expect(gotMyController).toBeDefined();
|
|
2275
|
-
expect(gotMyController instanceof MyController).toBe(true);
|
|
2276
|
-
});
|
|
2277
|
-
|
|
2278
2227
|
it("can be required from a parent directive", () => {
|
|
2279
2228
|
function MyController() {}
|
|
2280
2229
|
var gotMyController;
|
|
@@ -3386,27 +3335,6 @@ describe("$compile", () => {
|
|
|
3386
3335
|
|
|
3387
3336
|
expect(transclude()[0].outerHTML.match(/in-transclude/)).toBeTruthy();
|
|
3388
3337
|
});
|
|
3389
|
-
|
|
3390
|
-
it("can be used with multi-element directives", () => {
|
|
3391
|
-
registerDirectives({
|
|
3392
|
-
myTranscluder: function ($compile) {
|
|
3393
|
-
return {
|
|
3394
|
-
transclude: true,
|
|
3395
|
-
multiElement: true,
|
|
3396
|
-
template: "<div in-template></div>",
|
|
3397
|
-
link: function (scope, element, attrs, ctrl, transclude) {
|
|
3398
|
-
element[0].append(transclude()[0]);
|
|
3399
|
-
},
|
|
3400
|
-
};
|
|
3401
|
-
},
|
|
3402
|
-
});
|
|
3403
|
-
reloadModules();
|
|
3404
|
-
var el = $(
|
|
3405
|
-
"<div><div my-transcluder-start><div in-transclude></div></div><div my-transcluder-end></div></div>",
|
|
3406
|
-
);
|
|
3407
|
-
$compile(el)($rootScope);
|
|
3408
|
-
expect(el[0].outerHTML.match(/in-transclude/)).toBeTruthy();
|
|
3409
|
-
});
|
|
3410
3338
|
});
|
|
3411
3339
|
|
|
3412
3340
|
describe("clone attach function", () => {
|
|
@@ -3736,7 +3664,9 @@ describe("$compile", () => {
|
|
|
3736
3664
|
return {
|
|
3737
3665
|
transclude: "element",
|
|
3738
3666
|
link: function (scope, el, attrs, ctrl, transclude) {
|
|
3739
|
-
|
|
3667
|
+
debugger;
|
|
3668
|
+
const res = transclude();
|
|
3669
|
+
el.after(res);
|
|
3740
3670
|
},
|
|
3741
3671
|
};
|
|
3742
3672
|
},
|
|
@@ -4975,36 +4905,36 @@ describe("$compile", () => {
|
|
|
4975
4905
|
// We compile the contents of element (i.e. not element itself)
|
|
4976
4906
|
// Then delete these contents and check the cache has been reset to zero
|
|
4977
4907
|
// Clear cache
|
|
4978
|
-
|
|
4908
|
+
Cache.clear();
|
|
4979
4909
|
window.angular.module("test1", ["ng"]);
|
|
4980
4910
|
createInjector(["test1"]).invoke(($compile) => {
|
|
4981
|
-
expect(
|
|
4911
|
+
expect(Cache.size).toEqual(0);
|
|
4982
4912
|
// First with only elements at the top level
|
|
4983
4913
|
element = JQLite("<div><div></div></div>");
|
|
4984
4914
|
$compile(element[0].childNodes)($rootScope);
|
|
4985
|
-
// expect(
|
|
4915
|
+
// expect(Cache.size).toEqual(2);
|
|
4986
4916
|
element.empty();
|
|
4987
|
-
expect(
|
|
4917
|
+
expect(Cache.size).toEqual(0);
|
|
4988
4918
|
|
|
4989
4919
|
// Next with non-empty text nodes at the top level
|
|
4990
4920
|
// (in this case the compiler will wrap them in a <span>)
|
|
4991
4921
|
element = JQLite("<div>xxx</div>");
|
|
4992
4922
|
$compile(element[0].childNodes)($rootScope);
|
|
4993
4923
|
element.empty();
|
|
4994
|
-
expect(
|
|
4924
|
+
expect(Cache.size).toEqual(0);
|
|
4995
4925
|
|
|
4996
4926
|
// Next with comment nodes at the top level
|
|
4997
4927
|
element = JQLite("<div><!-- comment --></div>");
|
|
4998
4928
|
$compile(element[0].childNodes)($rootScope);
|
|
4999
4929
|
element.empty();
|
|
5000
|
-
expect(
|
|
4930
|
+
expect(Cache.size).toEqual(0);
|
|
5001
4931
|
|
|
5002
4932
|
// Finally with empty text nodes at the top level
|
|
5003
4933
|
element = JQLite("<div> \n<div></div> </div>");
|
|
5004
4934
|
$compile(element[0].childNodes)($rootScope);
|
|
5005
|
-
//expect(
|
|
4935
|
+
//expect(Cache.size).toEqual(2);
|
|
5006
4936
|
element.empty();
|
|
5007
|
-
expect(
|
|
4937
|
+
expect(Cache.size).toEqual(0);
|
|
5008
4938
|
});
|
|
5009
4939
|
});
|
|
5010
4940
|
|
|
@@ -13287,52 +13217,6 @@ describe("$compile", () => {
|
|
|
13287
13217
|
}).toThrowError(/multidir/);
|
|
13288
13218
|
});
|
|
13289
13219
|
|
|
13290
|
-
it("should correctly handle multi-element directives", () => {
|
|
13291
|
-
module
|
|
13292
|
-
.directive(
|
|
13293
|
-
"foo",
|
|
13294
|
-
valueFn({
|
|
13295
|
-
template: "[<div ng-transclude></div>]",
|
|
13296
|
-
transclude: true,
|
|
13297
|
-
}),
|
|
13298
|
-
)
|
|
13299
|
-
.directive(
|
|
13300
|
-
"bar",
|
|
13301
|
-
valueFn({
|
|
13302
|
-
template:
|
|
13303
|
-
'[<div ng-transclude="header"></div>|<div ng-transclude="footer"></div>]',
|
|
13304
|
-
transclude: {
|
|
13305
|
-
header: "header",
|
|
13306
|
-
footer: "footer",
|
|
13307
|
-
},
|
|
13308
|
-
}),
|
|
13309
|
-
);
|
|
13310
|
-
initInjector("test1");
|
|
13311
|
-
const tmplWithFoo =
|
|
13312
|
-
"<foo>" +
|
|
13313
|
-
'<div ng-if-start="true">Hello, </div>' +
|
|
13314
|
-
"<div ng-if-end>world!</div>" +
|
|
13315
|
-
"</foo>";
|
|
13316
|
-
const tmplWithBar =
|
|
13317
|
-
"<bar>" +
|
|
13318
|
-
'<header ng-if-start="true">This is a </header>' +
|
|
13319
|
-
"<header ng-if-end>header!</header>" +
|
|
13320
|
-
'<footer ng-if-start="true">This is a </footer>' +
|
|
13321
|
-
"<footer ng-if-end>footer!</footer>" +
|
|
13322
|
-
"</bar>";
|
|
13323
|
-
|
|
13324
|
-
const elem1 = $compile(tmplWithFoo)($rootScope);
|
|
13325
|
-
const elem2 = $compile(tmplWithBar)($rootScope);
|
|
13326
|
-
|
|
13327
|
-
$rootScope.$digest();
|
|
13328
|
-
|
|
13329
|
-
expect(elem1.text()).toBe("[Hello, world!]");
|
|
13330
|
-
expect(elem2.text()).toBe("[This is a header!|This is a footer!]");
|
|
13331
|
-
|
|
13332
|
-
dealoc(elem1);
|
|
13333
|
-
dealoc(elem2);
|
|
13334
|
-
});
|
|
13335
|
-
|
|
13336
13220
|
// see issue https://github.com/angular/angular.js/issues/12936
|
|
13337
13221
|
it("should use the proper scope when it is on the root element of a replaced directive template", () => {
|
|
13338
13222
|
module
|
|
@@ -13421,28 +13305,28 @@ describe("$compile", () => {
|
|
|
13421
13305
|
});
|
|
13422
13306
|
|
|
13423
13307
|
it('should not leak if two "element" transclusions are on the same element', () => {
|
|
13424
|
-
const cacheSize =
|
|
13308
|
+
const cacheSize = Cache.size;
|
|
13425
13309
|
|
|
13426
13310
|
element = $compile(
|
|
13427
13311
|
'<div><div ng-repeat="x in xs" ng-if="x==1">{{x}}</div></div>',
|
|
13428
13312
|
)($rootScope);
|
|
13429
|
-
expect(
|
|
13313
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13430
13314
|
|
|
13431
13315
|
$rootScope.$apply("xs = [0,1]");
|
|
13432
|
-
expect(
|
|
13316
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13433
13317
|
|
|
13434
13318
|
$rootScope.$apply("xs = [0]");
|
|
13435
|
-
expect(
|
|
13319
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13436
13320
|
|
|
13437
13321
|
$rootScope.$apply("xs = []");
|
|
13438
|
-
expect(
|
|
13322
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13439
13323
|
|
|
13440
13324
|
element.remove();
|
|
13441
|
-
expect(
|
|
13325
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13442
13326
|
});
|
|
13443
13327
|
|
|
13444
13328
|
it('should not leak if two "element" transclusions are on the same element', () => {
|
|
13445
|
-
const cacheSize =
|
|
13329
|
+
const cacheSize = Cache.size;
|
|
13446
13330
|
element = $compile(
|
|
13447
13331
|
'<div><div ng-repeat="x in xs" ng-if="val">{{x}}</div></div>',
|
|
13448
13332
|
)($rootScope);
|
|
@@ -13450,20 +13334,20 @@ describe("$compile", () => {
|
|
|
13450
13334
|
$rootScope.$apply("xs = [0,1]");
|
|
13451
13335
|
// At this point we have a bunch of comment placeholders but no real transcluded elements
|
|
13452
13336
|
// So the cache only contains the root element's data
|
|
13453
|
-
expect(
|
|
13337
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13454
13338
|
|
|
13455
13339
|
$rootScope.$apply("val = true");
|
|
13456
13340
|
// Now we have two concrete transcluded elements plus some comments so two more cache items
|
|
13457
|
-
expect(
|
|
13341
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13458
13342
|
|
|
13459
13343
|
$rootScope.$apply("val = false");
|
|
13460
13344
|
// Once again we only have comments so no transcluded elements and the cache is back to just
|
|
13461
13345
|
// the root element
|
|
13462
|
-
expect(
|
|
13346
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13463
13347
|
|
|
13464
13348
|
element.remove();
|
|
13465
13349
|
// Now we've even removed the root element along with its cache
|
|
13466
|
-
expect(
|
|
13350
|
+
expect(Cache.size).toEqual(cacheSize);
|
|
13467
13351
|
});
|
|
13468
13352
|
|
|
13469
13353
|
// it("should not leak when continuing the compilation of elements on a scope that was destroyed", () => {
|
|
@@ -13488,7 +13372,7 @@ describe("$compile", () => {
|
|
|
13488
13372
|
// link: linkFn,
|
|
13489
13373
|
// }));
|
|
13490
13374
|
// initInjector("test1");
|
|
13491
|
-
// const cacheSize =
|
|
13375
|
+
// const cacheSize = Cache.size;
|
|
13492
13376
|
// $templateCache.set("red.html", "<p>red</p>");
|
|
13493
13377
|
// const template = $compile(
|
|
13494
13378
|
// '<div ng-controller="Leak">' +
|
|
@@ -13503,7 +13387,7 @@ describe("$compile", () => {
|
|
|
13503
13387
|
// $rootScope.$digest();
|
|
13504
13388
|
|
|
13505
13389
|
// expect(linkFn).toHaveBeenCalled();
|
|
13506
|
-
// expect(
|
|
13390
|
+
// expect(Cache.size).toEqual(cacheSize + 2);
|
|
13507
13391
|
|
|
13508
13392
|
// $templateCache = new Map();
|
|
13509
13393
|
// const destroyedScope = $rootScope.$new();
|
|
@@ -13532,7 +13416,7 @@ describe("$compile", () => {
|
|
|
13532
13416
|
$rootScope.$apply(`xs = [${xs}]`);
|
|
13533
13417
|
firstRepeatedElem = element.children(".ng-scope").eq(0);
|
|
13534
13418
|
|
|
13535
|
-
privateData =
|
|
13419
|
+
privateData = Cache.get(firstRepeatedElem[0][EXPANDO]);
|
|
13536
13420
|
expect(privateData.events).toBeDefined();
|
|
13537
13421
|
|
|
13538
13422
|
expect(privateData.events.click).toBeDefined();
|
|
@@ -13548,7 +13432,7 @@ describe("$compile", () => {
|
|
|
13548
13432
|
|
|
13549
13433
|
expect(destroyCount).toBe(2);
|
|
13550
13434
|
expect(firstRepeatedElem.data("$scope")).not.toBeDefined();
|
|
13551
|
-
privateData =
|
|
13435
|
+
privateData = Cache.get(firstRepeatedElem[0][EXPANDO]);
|
|
13552
13436
|
expect(privateData && privateData.events).not.toBeDefined();
|
|
13553
13437
|
}
|
|
13554
13438
|
|
|
@@ -14246,35 +14130,6 @@ describe("$compile", () => {
|
|
|
14246
14130
|
expect(countChildScopes($rootScope)).toBe(0);
|
|
14247
14131
|
});
|
|
14248
14132
|
|
|
14249
|
-
it("should not leak the transclude scope when the transcluded content is an multi-element transclusion directive", () => {
|
|
14250
|
-
element = $compile(
|
|
14251
|
-
"<div toggle>" +
|
|
14252
|
-
"<div ng-repeat-start=\"msg in ['msg-1']\">{{ msg }}</div>" +
|
|
14253
|
-
"<div ng-repeat-end>{{ msg }}</div>" +
|
|
14254
|
-
"</div>",
|
|
14255
|
-
)($rootScope);
|
|
14256
|
-
|
|
14257
|
-
$rootScope.$apply("t = true");
|
|
14258
|
-
expect(element.text()).toContain("msg-1msg-1");
|
|
14259
|
-
// Expected scopes: $rootScope, ngIf, transclusion, ngRepeat
|
|
14260
|
-
expect(countChildScopes($rootScope)).toBe(3);
|
|
14261
|
-
|
|
14262
|
-
$rootScope.$apply("t = false");
|
|
14263
|
-
expect(element.text()).not.toContain("msg-1msg-1");
|
|
14264
|
-
// Expected scopes: $rootScope
|
|
14265
|
-
expect(countChildScopes($rootScope)).toBe(0);
|
|
14266
|
-
|
|
14267
|
-
$rootScope.$apply("t = true");
|
|
14268
|
-
expect(element.text()).toContain("msg-1msg-1");
|
|
14269
|
-
// Expected scopes: $rootScope, ngIf, transclusion, ngRepeat
|
|
14270
|
-
expect(countChildScopes($rootScope)).toBe(3);
|
|
14271
|
-
|
|
14272
|
-
$rootScope.$apply("t = false");
|
|
14273
|
-
expect(element.text()).not.toContain("msg-1msg-1");
|
|
14274
|
-
// Expected scopes: $rootScope
|
|
14275
|
-
expect(countChildScopes($rootScope)).toBe(0);
|
|
14276
|
-
});
|
|
14277
|
-
|
|
14278
14133
|
it("should not leak the transclude scope if the transcluded contains only comments", () => {
|
|
14279
14134
|
element = $compile("<div toggle><!-- some comment --></div>")(
|
|
14280
14135
|
$rootScope,
|
|
@@ -14437,7 +14292,7 @@ describe("$compile", () => {
|
|
|
14437
14292
|
|
|
14438
14293
|
it("should not leak memory with nested transclusion", () => {
|
|
14439
14294
|
let size;
|
|
14440
|
-
const initialSize =
|
|
14295
|
+
const initialSize = Cache.size;
|
|
14441
14296
|
|
|
14442
14297
|
element = JQLite(
|
|
14443
14298
|
'<div><ul><li ng-repeat="n in nums">{{n}} => <i ng-if="0 === n%2">Even</i><i ng-if="1 === n%2">Odd</i></li></ul></div>',
|
|
@@ -14446,14 +14301,14 @@ describe("$compile", () => {
|
|
|
14446
14301
|
|
|
14447
14302
|
$rootScope.nums = [0, 1, 2];
|
|
14448
14303
|
$rootScope.$apply();
|
|
14449
|
-
size =
|
|
14304
|
+
size = Cache.size;
|
|
14450
14305
|
|
|
14451
14306
|
$rootScope.nums = [3, 4, 5];
|
|
14452
14307
|
$rootScope.$apply();
|
|
14453
|
-
expect(
|
|
14308
|
+
expect(Cache.size).toEqual(size);
|
|
14454
14309
|
|
|
14455
14310
|
element.remove();
|
|
14456
|
-
expect(
|
|
14311
|
+
expect(Cache.size).toEqual(initialSize);
|
|
14457
14312
|
});
|
|
14458
14313
|
});
|
|
14459
14314
|
|
|
@@ -16811,339 +16666,6 @@ describe("$compile", () => {
|
|
|
16811
16666
|
});
|
|
16812
16667
|
});
|
|
16813
16668
|
|
|
16814
|
-
describe("multi-element directive", () => {
|
|
16815
|
-
it("should group on link function", async () => {
|
|
16816
|
-
$rootScope.show = false;
|
|
16817
|
-
element = $compile(
|
|
16818
|
-
"<div>" +
|
|
16819
|
-
'<span ng-show-start="show"></span>' +
|
|
16820
|
-
"<span ng-show-end='show'></span>" +
|
|
16821
|
-
"</div>",
|
|
16822
|
-
)($rootScope);
|
|
16823
|
-
$rootScope.$digest();
|
|
16824
|
-
await wait(100);
|
|
16825
|
-
const spans = element.find("span");
|
|
16826
|
-
expect(spans.eq(0)[0].classList.contains("ng-hide")).toBeTrue();
|
|
16827
|
-
expect(spans.eq(1)[0].classList.contains("ng-hide")).toBeTrue();
|
|
16828
|
-
});
|
|
16829
|
-
|
|
16830
|
-
it("should group on compile function", () => {
|
|
16831
|
-
$rootScope.show = false;
|
|
16832
|
-
element = $compile(
|
|
16833
|
-
"<div>" +
|
|
16834
|
-
'<span ng-repeat-start="i in [1,2]">{{i}}A</span>' +
|
|
16835
|
-
"<span ng-repeat-end>{{i}}B;</span>" +
|
|
16836
|
-
"</div>",
|
|
16837
|
-
)($rootScope);
|
|
16838
|
-
$rootScope.$digest();
|
|
16839
|
-
expect(element.text()).toEqual("1A1B;2A2B;");
|
|
16840
|
-
});
|
|
16841
|
-
|
|
16842
|
-
it("should support grouping over text nodes", () => {
|
|
16843
|
-
$rootScope.show = false;
|
|
16844
|
-
element = $compile(
|
|
16845
|
-
"<div>" +
|
|
16846
|
-
'<span ng-repeat-start="i in [1,2]">{{i}}A</span>' +
|
|
16847
|
-
":" + // Important: proves that we can iterate over non-elements
|
|
16848
|
-
"<span ng-repeat-end>{{i}}B;</span>" +
|
|
16849
|
-
"</div>",
|
|
16850
|
-
)($rootScope);
|
|
16851
|
-
$rootScope.$digest();
|
|
16852
|
-
expect(element.text()).toEqual("1A:1B;2A:2B;");
|
|
16853
|
-
});
|
|
16854
|
-
|
|
16855
|
-
it("should group on $root compile function", () => {
|
|
16856
|
-
$rootScope.show = false;
|
|
16857
|
-
element = $compile(
|
|
16858
|
-
"<div></div>" +
|
|
16859
|
-
'<span ng-repeat-start="i in [1,2]">{{i}}A</span>' +
|
|
16860
|
-
"<span ng-repeat-end>{{i}}B;</span>" +
|
|
16861
|
-
"<div></div>",
|
|
16862
|
-
)($rootScope);
|
|
16863
|
-
$rootScope.$digest();
|
|
16864
|
-
element = JQLite(element[0].parentNode.childNodes); // reset because repeater is top level.
|
|
16865
|
-
expect(element.text()).toEqual("1A1B;2A2B;");
|
|
16866
|
-
});
|
|
16867
|
-
|
|
16868
|
-
it("should group on nested groups", () => {
|
|
16869
|
-
module.directive(
|
|
16870
|
-
"ngMultiBind",
|
|
16871
|
-
valueFn({
|
|
16872
|
-
multiElement: true,
|
|
16873
|
-
link(scope, element, attr) {
|
|
16874
|
-
element.text(scope.$eval(attr.ngMultiBind));
|
|
16875
|
-
},
|
|
16876
|
-
}),
|
|
16877
|
-
);
|
|
16878
|
-
initInjector("test1");
|
|
16879
|
-
|
|
16880
|
-
$rootScope.show = false;
|
|
16881
|
-
element = $compile(
|
|
16882
|
-
"<div></div>" +
|
|
16883
|
-
'<div ng-repeat-start="i in [1,2]">{{i}}A</div>' +
|
|
16884
|
-
"<span ng-multi-bind-start=\"'.'\"></span>" +
|
|
16885
|
-
"<span ng-multi-bind-end></span>" +
|
|
16886
|
-
"<div ng-repeat-end>{{i}}B;</div>" +
|
|
16887
|
-
"<div></div>",
|
|
16888
|
-
)($rootScope);
|
|
16889
|
-
$rootScope.$digest();
|
|
16890
|
-
element = JQLite(element[0].parentNode.childNodes); // reset because repeater is top level.
|
|
16891
|
-
expect(element.text()).toEqual("1A..1B;2A..2B;");
|
|
16892
|
-
});
|
|
16893
|
-
|
|
16894
|
-
it("should group on nested groups of same directive", () => {
|
|
16895
|
-
$rootScope.show = false;
|
|
16896
|
-
element = $compile(
|
|
16897
|
-
"<div></div>" +
|
|
16898
|
-
'<div ng-repeat-start="i in [1,2]">{{i}}(</div>' +
|
|
16899
|
-
'<span ng-repeat-start="j in [2,3]">{{j}}-</span>' +
|
|
16900
|
-
"<span ng-repeat-end>{{j}}</span>" +
|
|
16901
|
-
"<div ng-repeat-end>){{i}};</div>" +
|
|
16902
|
-
"<div></div>",
|
|
16903
|
-
)($rootScope);
|
|
16904
|
-
$rootScope.$digest();
|
|
16905
|
-
element = JQLite(element[0].parentNode.childNodes); // reset because repeater is top level.
|
|
16906
|
-
expect(element.text()).toEqual("1(2-23-3)1;2(2-23-3)2;");
|
|
16907
|
-
});
|
|
16908
|
-
|
|
16909
|
-
it("should set up and destroy the transclusion scopes correctly", () => {
|
|
16910
|
-
element = $compile(
|
|
16911
|
-
"<div>" +
|
|
16912
|
-
'<div ng-if-start="val0"><span ng-if="val1"></span></div>' +
|
|
16913
|
-
'<div ng-if-end><span ng-if="val2"></span></div>' +
|
|
16914
|
-
"</div>",
|
|
16915
|
-
)($rootScope);
|
|
16916
|
-
$rootScope.$apply("val0 = true; val1 = true; val2 = true");
|
|
16917
|
-
expect($rootScope.$$childHead).toBeTruthy();
|
|
16918
|
-
expect($rootScope.$$childHead.$$childHead).toBeTruthy();
|
|
16919
|
-
// At this point we should have something like:
|
|
16920
|
-
//
|
|
16921
|
-
// <div>
|
|
16922
|
-
//
|
|
16923
|
-
// <!---->
|
|
16924
|
-
// <div ng-if-start="val0">
|
|
16925
|
-
// <!---->
|
|
16926
|
-
// <span ng-if="val1"></span>
|
|
16927
|
-
// <!---->
|
|
16928
|
-
// </div>
|
|
16929
|
-
//
|
|
16930
|
-
// <div ng-if-end="">
|
|
16931
|
-
// <!---->
|
|
16932
|
-
// <span ng-if="val2"></span>
|
|
16933
|
-
// <!---->
|
|
16934
|
-
// </div>
|
|
16935
|
-
//
|
|
16936
|
-
// <!---->
|
|
16937
|
-
// </div>
|
|
16938
|
-
// const ngIfStartScope = element.find("div").eq(0).scope();
|
|
16939
|
-
// const ngIfEndScope = element.find("div").eq(1).scope();
|
|
16940
|
-
|
|
16941
|
-
// expect(ngIfStartScope.$id).toEqual(ngIfEndScope.$id);
|
|
16942
|
-
|
|
16943
|
-
// const ngIf1Scope = element.find("span").eq(0).scope();
|
|
16944
|
-
// const ngIf2Scope = element.find("span").eq(1).scope();
|
|
16945
|
-
|
|
16946
|
-
// expect(ngIf1Scope.$id).not.toEqual(ngIf2Scope.$id);
|
|
16947
|
-
// expect(ngIf1Scope.$parent.$id).toEqual(ngIf2Scope.$parent.$id);
|
|
16948
|
-
|
|
16949
|
-
$rootScope.$apply("val1 = false");
|
|
16950
|
-
// Now we should have something like:
|
|
16951
|
-
//
|
|
16952
|
-
// <div>
|
|
16953
|
-
// <!-- ngIf: val0 -->
|
|
16954
|
-
// <div ng-if-start="val0">
|
|
16955
|
-
// <!-- ngIf: val1 -->
|
|
16956
|
-
// </div>
|
|
16957
|
-
// <div ng-if-end="">
|
|
16958
|
-
// <!-- ngIf: val2 -->
|
|
16959
|
-
// <span ng-if="val2"></span>
|
|
16960
|
-
// <!-- end ngIf: val2 -->
|
|
16961
|
-
// </div>
|
|
16962
|
-
// <!-- end ngIf: val0 -->
|
|
16963
|
-
// </div>
|
|
16964
|
-
|
|
16965
|
-
// expect(ngIfStartScope.$$destroyed).not.toEqual(true);
|
|
16966
|
-
// expect(ngIf1Scope.$$destroyed).toEqual(true);
|
|
16967
|
-
// expect(ngIf2Scope.$$destroyed).not.toEqual(true);
|
|
16968
|
-
|
|
16969
|
-
$rootScope.$apply("val0 = false");
|
|
16970
|
-
|
|
16971
|
-
// Now we should have something like:
|
|
16972
|
-
//
|
|
16973
|
-
// <div>
|
|
16974
|
-
// <!-- ngIf: val0 -->
|
|
16975
|
-
// </div>
|
|
16976
|
-
// TODO: Until we figure out a better way of testing this
|
|
16977
|
-
expect($rootScope.$$childHead).toBeNull();
|
|
16978
|
-
// expect(ngIfStartScope.$$destroyed).toEqual(true);
|
|
16979
|
-
// expect(ngIf1Scope.$$destroyed).toEqual(true);
|
|
16980
|
-
// expect(ngIf2Scope.$$destroyed).toEqual(true);
|
|
16981
|
-
});
|
|
16982
|
-
|
|
16983
|
-
it("should set up and destroy the transclusion scopes correctly", () => {
|
|
16984
|
-
element = $compile(
|
|
16985
|
-
"<div>" +
|
|
16986
|
-
'<div ng-repeat-start="val in val0" ng-if="val1"></div>' +
|
|
16987
|
-
'<div ng-repeat-end ng-if="val2"></div>' +
|
|
16988
|
-
"</div>",
|
|
16989
|
-
)($rootScope);
|
|
16990
|
-
|
|
16991
|
-
// To begin with there is (almost) nothing:
|
|
16992
|
-
// <div>
|
|
16993
|
-
// <!-- ngRepeat: val in val0 -->
|
|
16994
|
-
// </div>
|
|
16995
|
-
|
|
16996
|
-
//expect(element.scope().$id).toEqual($rootScope.$id);
|
|
16997
|
-
|
|
16998
|
-
// Now we create all the elements
|
|
16999
|
-
$rootScope.$apply("val0 = [1]; val1 = true; val2 = true");
|
|
17000
|
-
|
|
17001
|
-
// At this point we have:
|
|
17002
|
-
//
|
|
17003
|
-
// <div>
|
|
17004
|
-
//
|
|
17005
|
-
// <!-- ngRepeat: val in val0 -->
|
|
17006
|
-
// <!-- ngIf: val1 -->
|
|
17007
|
-
// <div ng-repeat-start="val in val0">
|
|
17008
|
-
// </div>
|
|
17009
|
-
// <!-- end ngIf: val1 -->
|
|
17010
|
-
//
|
|
17011
|
-
// <!-- ngIf: val2 -->
|
|
17012
|
-
// <div ng-repeat-end="">
|
|
17013
|
-
// </div>
|
|
17014
|
-
// <!-- end ngIf: val2 -->
|
|
17015
|
-
// <!-- end ngRepeat: val in val0 -->
|
|
17016
|
-
// </div>
|
|
17017
|
-
// const ngIf1Scope = element.find("div").eq(0).scope();
|
|
17018
|
-
// const ngIf2Scope = element.find("div").eq(1).scope();
|
|
17019
|
-
// const ngRepeatScope = ngIf1Scope.$parent;
|
|
17020
|
-
|
|
17021
|
-
// expect(ngIf1Scope.$id).not.toEqual(ngIf2Scope.$id);
|
|
17022
|
-
// expect(ngIf1Scope.$parent.$id).toEqual(ngRepeatScope.$id);
|
|
17023
|
-
// expect(ngIf2Scope.$parent.$id).toEqual(ngRepeatScope.$id);
|
|
17024
|
-
|
|
17025
|
-
// // What is happening here??
|
|
17026
|
-
// // We seem to have a repeater scope which doesn't actually match to any element
|
|
17027
|
-
// expect(ngRepeatScope.$parent.$id).toEqual($rootScope.$id);
|
|
17028
|
-
|
|
17029
|
-
// Now remove the first ngIf element from the first item in the repeater
|
|
17030
|
-
$rootScope.$apply("val1 = false");
|
|
17031
|
-
|
|
17032
|
-
// At this point we should have:
|
|
17033
|
-
//
|
|
17034
|
-
// <div>
|
|
17035
|
-
// <!-- ngRepeat: val in val0 -->
|
|
17036
|
-
//
|
|
17037
|
-
// <!-- ngIf: val1 -->
|
|
17038
|
-
//
|
|
17039
|
-
// <!-- ngIf: val2 -->
|
|
17040
|
-
// <div ng-repeat-end="" ng-if="val2"></div>
|
|
17041
|
-
// <!-- end ngIf: val2 -->
|
|
17042
|
-
//
|
|
17043
|
-
// <!-- end ngRepeat: val in val0 -->
|
|
17044
|
-
// </div>
|
|
17045
|
-
//
|
|
17046
|
-
// expect(ngRepeatScope.$$destroyed).toEqual(false);
|
|
17047
|
-
// expect(ngIf1Scope.$$destroyed).toEqual(true);
|
|
17048
|
-
// expect(ngIf2Scope.$$destroyed).toEqual(false);
|
|
17049
|
-
|
|
17050
|
-
// Now remove the second ngIf element from the first item in the repeater
|
|
17051
|
-
$rootScope.$apply("val2 = false");
|
|
17052
|
-
|
|
17053
|
-
// We are mostly back to where we started
|
|
17054
|
-
//
|
|
17055
|
-
// <div>
|
|
17056
|
-
// <!-- ngRepeat: val in val0 -->
|
|
17057
|
-
// <!-- ngIf: val1 -->
|
|
17058
|
-
// <!-- ngIf: val2 -->
|
|
17059
|
-
// <!-- end ngRepeat: val in val0 -->
|
|
17060
|
-
// </div>
|
|
17061
|
-
|
|
17062
|
-
// expect(ngRepeatScope.$$destroyed).toEqual(false);
|
|
17063
|
-
// expect(ngIf1Scope.$$destroyed).toEqual(true);
|
|
17064
|
-
// expect(ngIf2Scope.$$destroyed).toEqual(true);
|
|
17065
|
-
|
|
17066
|
-
// Finally remove the repeat items
|
|
17067
|
-
$rootScope.$apply("val0 = []");
|
|
17068
|
-
|
|
17069
|
-
// Somehow this ngRepeat scope knows how to destroy itself...
|
|
17070
|
-
expect($rootScope.$$childHead).toBeNull();
|
|
17071
|
-
// expect(ngRepeatScope.$$destroyed).toEqual(true);
|
|
17072
|
-
// expect(ngIf1Scope.$$destroyed).toEqual(true);
|
|
17073
|
-
// expect(ngIf2Scope.$$destroyed).toEqual(true);
|
|
17074
|
-
});
|
|
17075
|
-
|
|
17076
|
-
it("should throw error if unterminated", () => {
|
|
17077
|
-
module.directive("foo", () => ({
|
|
17078
|
-
multiElement: true,
|
|
17079
|
-
}));
|
|
17080
|
-
initInjector("test1");
|
|
17081
|
-
expect(() => {
|
|
17082
|
-
element = $compile("<div><span foo-start></span></div>");
|
|
17083
|
-
}).toThrowError(/uterdir/);
|
|
17084
|
-
});
|
|
17085
|
-
|
|
17086
|
-
it("should correctly collect ranges on multiple directives on a single element", () => {
|
|
17087
|
-
module
|
|
17088
|
-
.directive("emptyDirective", () => ({
|
|
17089
|
-
multiElement: true,
|
|
17090
|
-
link(scope, element) {
|
|
17091
|
-
element.data("x", "abc");
|
|
17092
|
-
},
|
|
17093
|
-
}))
|
|
17094
|
-
.directive("rangeDirective", () => ({
|
|
17095
|
-
multiElement: true,
|
|
17096
|
-
link(scope) {
|
|
17097
|
-
scope.x = "X";
|
|
17098
|
-
scope.y = "Y";
|
|
17099
|
-
},
|
|
17100
|
-
}));
|
|
17101
|
-
initInjector("test1");
|
|
17102
|
-
element = $compile(
|
|
17103
|
-
"<div>" +
|
|
17104
|
-
"<div range-directive-start empty-directive>{{x}}</div>" +
|
|
17105
|
-
"<div range-directive-end>{{y}}</div>" +
|
|
17106
|
-
"</div>",
|
|
17107
|
-
)($rootScope);
|
|
17108
|
-
|
|
17109
|
-
$rootScope.$digest();
|
|
17110
|
-
|
|
17111
|
-
expect(element.text()).toBe("XY");
|
|
17112
|
-
///expect(angular.element(element[0].firstChild).data("x")).toBe("abc");
|
|
17113
|
-
});
|
|
17114
|
-
|
|
17115
|
-
it("should throw error if unterminated (containing termination as a child)", () => {
|
|
17116
|
-
module.directive("foo", () => ({
|
|
17117
|
-
multiElement: true,
|
|
17118
|
-
}));
|
|
17119
|
-
initInjector("test1");
|
|
17120
|
-
expect(() => {
|
|
17121
|
-
element = $compile(
|
|
17122
|
-
"<div><span foo-start><span foo-end></span></span></div>",
|
|
17123
|
-
);
|
|
17124
|
-
}).toThrowError(/uterdir/);
|
|
17125
|
-
});
|
|
17126
|
-
|
|
17127
|
-
it("should support data- prefix", async () => {
|
|
17128
|
-
$rootScope.show = false;
|
|
17129
|
-
element = $compile(
|
|
17130
|
-
"<div>" +
|
|
17131
|
-
'<span data-ng-show-start="show"></span>' +
|
|
17132
|
-
"<span data-ng-show-end></span>" +
|
|
17133
|
-
'<span ng-show-start="show"></span>' +
|
|
17134
|
-
"<span ng-show-end></span>" +
|
|
17135
|
-
"</div>",
|
|
17136
|
-
)($rootScope);
|
|
17137
|
-
$rootScope.$digest();
|
|
17138
|
-
await wait(100);
|
|
17139
|
-
const spans = element.find("span");
|
|
17140
|
-
expect(spans.eq(0)[0].classList.contains("ng-hide")).toBeTrue();
|
|
17141
|
-
//expect(spans.eq(1)[0].classList.contains("ng-hide")).toBeTrue();
|
|
17142
|
-
expect(spans.eq(2)[0].classList.contains("ng-hide")).toBeTrue();
|
|
17143
|
-
// expect(spans.eq(3)[0].classList.contains("ng-hide")).toBeTrue();
|
|
17144
|
-
});
|
|
17145
|
-
});
|
|
17146
|
-
|
|
17147
16669
|
// TODO ANIMATIONS
|
|
17148
16670
|
// describe("$animate animation hooks", () => {
|
|
17149
16671
|
// beforeEach(module("ngAnimateMock"));
|
|
@@ -17198,130 +16720,6 @@ describe("$compile", () => {
|
|
|
17198
16720
|
// });
|
|
17199
16721
|
// });
|
|
17200
16722
|
|
|
17201
|
-
describe("element replacement", () => {
|
|
17202
|
-
it("should broadcast $destroy only on removed elements, not replaced", () => {
|
|
17203
|
-
const linkCalls = [];
|
|
17204
|
-
const destroyCalls = [];
|
|
17205
|
-
|
|
17206
|
-
module
|
|
17207
|
-
.directive("replace", () => ({
|
|
17208
|
-
multiElement: true,
|
|
17209
|
-
replace: true,
|
|
17210
|
-
templateUrl: "template123",
|
|
17211
|
-
}))
|
|
17212
|
-
.directive("foo", () => ({
|
|
17213
|
-
priority: 1, // before the replace directive
|
|
17214
|
-
link($scope, $element, $attrs) {
|
|
17215
|
-
linkCalls.push($attrs.foo);
|
|
17216
|
-
$element.on("$destroy", () => {
|
|
17217
|
-
destroyCalls.push($attrs.foo);
|
|
17218
|
-
});
|
|
17219
|
-
},
|
|
17220
|
-
}));
|
|
17221
|
-
initInjector("test1");
|
|
17222
|
-
$templateCache.set("template123", "<p></p>");
|
|
17223
|
-
|
|
17224
|
-
$compile(
|
|
17225
|
-
'<div replace-start foo="1"><span foo="1.1"></span></div>' +
|
|
17226
|
-
'<div foo="2"><span foo="2.1"></span></div>' +
|
|
17227
|
-
'<div replace-end foo="3"><span foo="3.1"></span></div>',
|
|
17228
|
-
)($rootScope);
|
|
17229
|
-
|
|
17230
|
-
expect(linkCalls).toEqual(["2", "3"]);
|
|
17231
|
-
expect(destroyCalls).toEqual([]);
|
|
17232
|
-
$rootScope.$apply();
|
|
17233
|
-
expect(linkCalls).toEqual(["2", "3", "1"]);
|
|
17234
|
-
expect(destroyCalls).toEqual(["2", "3"]);
|
|
17235
|
-
});
|
|
17236
|
-
|
|
17237
|
-
function sliceArgs(args, startIndex) {
|
|
17238
|
-
return [].slice.call(args, startIndex || 0);
|
|
17239
|
-
}
|
|
17240
|
-
|
|
17241
|
-
function getAll($root) {
|
|
17242
|
-
// check for .querySelectorAll to support comment nodes
|
|
17243
|
-
return [$root[0]].concat(
|
|
17244
|
-
$root[0].querySelectorAll
|
|
17245
|
-
? sliceArgs($root[0].querySelectorAll("*"))
|
|
17246
|
-
: [],
|
|
17247
|
-
);
|
|
17248
|
-
}
|
|
17249
|
-
|
|
17250
|
-
function testCompileLinkDataCleanup(template) {
|
|
17251
|
-
const toCompile = JQLite(template);
|
|
17252
|
-
|
|
17253
|
-
const preCompiledChildren = getAll(toCompile);
|
|
17254
|
-
Object.entries(preCompiledChildren).forEach(([i, element]) => {
|
|
17255
|
-
getOrSetCacheData(element, "foo", `template#${i}`);
|
|
17256
|
-
});
|
|
17257
|
-
|
|
17258
|
-
const linkedElements = $compile(toCompile)($rootScope);
|
|
17259
|
-
$rootScope.$apply();
|
|
17260
|
-
linkedElements.remove();
|
|
17261
|
-
|
|
17262
|
-
Object.entries(preCompiledChildren).forEach(([i, element]) => {
|
|
17263
|
-
expect(CACHE.has(element[EXPANDO])).toBe(false, `template#${i}`);
|
|
17264
|
-
});
|
|
17265
|
-
|
|
17266
|
-
Object.entries(linkedElements).forEach(([i, element]) => {
|
|
17267
|
-
expect(CACHE.has(element[EXPANDO])).toBe(false, `linked#${i}`);
|
|
17268
|
-
});
|
|
17269
|
-
}
|
|
17270
|
-
|
|
17271
|
-
it("should clean data of element-transcluded link-cloned elements", () => {
|
|
17272
|
-
testCompileLinkDataCleanup(
|
|
17273
|
-
'<div><div ng-repeat-start="i in [1,2]"><span></span></div><div ng-repeat-end></div></div>',
|
|
17274
|
-
);
|
|
17275
|
-
});
|
|
17276
|
-
|
|
17277
|
-
it("should clean data of element-transcluded elements", () => {
|
|
17278
|
-
testCompileLinkDataCleanup(
|
|
17279
|
-
'<div ng-if-start="false"><span><span/></div><span></span><div ng-if-end><span></span></div>',
|
|
17280
|
-
);
|
|
17281
|
-
});
|
|
17282
|
-
|
|
17283
|
-
function testReplaceElementCleanup(dirOptions) {
|
|
17284
|
-
const template = "<div></div>";
|
|
17285
|
-
module.directive("theDir", () => ({
|
|
17286
|
-
multiElement: true,
|
|
17287
|
-
replace: dirOptions.replace,
|
|
17288
|
-
transclude: dirOptions.transclude,
|
|
17289
|
-
template: dirOptions.asyncTemplate ? undefined : template,
|
|
17290
|
-
templateUrl: dirOptions.asyncTemplate
|
|
17291
|
-
? "the-dir-template-url"
|
|
17292
|
-
: undefined,
|
|
17293
|
-
}));
|
|
17294
|
-
initInjector("test1");
|
|
17295
|
-
$templateCache.set("the-dir-template-url", template);
|
|
17296
|
-
|
|
17297
|
-
testCompileLinkDataCleanup(
|
|
17298
|
-
"<div>" +
|
|
17299
|
-
"<div the-dir-start><span></span></div>" +
|
|
17300
|
-
"<div><span></span><span></span></div>" +
|
|
17301
|
-
"<div the-dir-end><span></span></div>" +
|
|
17302
|
-
"</div>",
|
|
17303
|
-
);
|
|
17304
|
-
}
|
|
17305
|
-
it("should clean data of elements removed for directive template", () => {
|
|
17306
|
-
testReplaceElementCleanup({});
|
|
17307
|
-
});
|
|
17308
|
-
it("should clean data of elements removed for directive templateUrl", () => {
|
|
17309
|
-
testReplaceElementCleanup({ asyncTemplate: true });
|
|
17310
|
-
});
|
|
17311
|
-
it("should clean data of elements transcluded into directive template", () => {
|
|
17312
|
-
testReplaceElementCleanup({ transclude: true });
|
|
17313
|
-
});
|
|
17314
|
-
it("should clean data of elements transcluded into directive templateUrl", () => {
|
|
17315
|
-
testReplaceElementCleanup({ transclude: true, asyncTemplate: true });
|
|
17316
|
-
});
|
|
17317
|
-
it("should clean data of elements replaced with directive template", () => {
|
|
17318
|
-
testReplaceElementCleanup({ replace: true });
|
|
17319
|
-
});
|
|
17320
|
-
it("should clean data of elements replaced with directive templateUrl", () => {
|
|
17321
|
-
testReplaceElementCleanup({ replace: true, asyncTemplate: true });
|
|
17322
|
-
});
|
|
17323
|
-
});
|
|
17324
|
-
|
|
17325
16723
|
describe("component helper", () => {
|
|
17326
16724
|
it("should return the module", () => {
|
|
17327
16725
|
const myModule = module;
|