@angular/core 8.1.0-next.2 → 8.1.1
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/bundles/core-testing.umd.js +1 -1
- package/bundles/core-testing.umd.js.map +1 -1
- package/bundles/core-testing.umd.min.js +1 -1
- package/bundles/core-testing.umd.min.js.map +1 -1
- package/bundles/core.umd.js +394 -279
- package/bundles/core.umd.js.map +1 -1
- package/bundles/core.umd.min.js +101 -101
- package/bundles/core.umd.min.js.map +1 -1
- package/core.d.ts +221 -234
- package/core.metadata.json +1 -1
- package/esm2015/index.js +2 -2
- package/esm2015/public_api.js +2 -2
- package/esm2015/src/change_detection/pipe_transform.js +4 -6
- package/esm2015/src/core.js +2 -2
- package/esm2015/src/core_render3_private_export.js +2 -2
- package/esm2015/src/di/index.js +1 -1
- package/esm2015/src/di/injectable.js +1 -1
- package/esm2015/src/di/interface/provider.js +1 -1
- package/esm2015/src/di/metadata.js +1 -1
- package/esm2015/src/event_emitter.js +3 -10
- package/esm2015/src/linker/component_factory.js +9 -3
- package/esm2015/src/linker/component_factory_resolver.js +9 -2
- package/esm2015/src/metadata/di.js +1 -1
- package/esm2015/src/metadata/directives.js +4 -3
- package/esm2015/src/reflection/reflection_capabilities.js +2 -2
- package/esm2015/src/render3/component.js +6 -2
- package/esm2015/src/render3/component_ref.js +18 -13
- package/esm2015/src/render3/di.js +4 -6
- package/esm2015/src/render3/features/providers_feature.js +6 -3
- package/esm2015/src/render3/i18n.js +20 -13
- package/esm2015/src/render3/index.js +2 -2
- package/esm2015/src/render3/instructions/all.js +2 -2
- package/esm2015/src/render3/instructions/attribute.js +5 -4
- package/esm2015/src/render3/instructions/embedded_view.js +5 -2
- package/esm2015/src/render3/instructions/property.js +9 -8
- package/esm2015/src/render3/instructions/shared.js +36 -5
- package/esm2015/src/render3/instructions/text.js +15 -20
- package/esm2015/src/render3/instructions/text_interpolation.js +67 -12
- package/esm2015/src/render3/interfaces/container.js +6 -2
- package/esm2015/src/render3/interfaces/i18n.js +1 -17
- package/esm2015/src/render3/interfaces/node.js +2 -2
- package/esm2015/src/render3/interfaces/view.js +2 -2
- package/esm2015/src/render3/jit/environment.js +1 -2
- package/esm2015/src/render3/node_manipulation.js +235 -197
- package/esm2015/src/render3/query.js +12 -8
- package/esm2015/src/render3/state.js +6 -3
- package/esm2015/src/render3/util/misc_utils.js +1 -1
- package/esm2015/src/render3/util/view_traversal_utils.js +7 -2
- package/esm2015/src/render3/view_engine_compatibility.js +39 -12
- package/esm2015/src/util/assert.js +3 -2
- package/esm2015/src/util/decorators.js +1 -1
- package/esm2015/src/version.js +1 -1
- package/esm2015/testing/src/test_bed_common.js +5 -2
- package/esm5/src/change_detection/pipe_transform.js +1 -1
- package/esm5/src/core_render3_private_export.js +2 -2
- package/esm5/src/di/index.js +1 -1
- package/esm5/src/di/injectable.js +1 -1
- package/esm5/src/di/interface/provider.js +1 -1
- package/esm5/src/di/metadata.js +1 -1
- package/esm5/src/event_emitter.js +3 -10
- package/esm5/src/linker/component_factory.js +7 -1
- package/esm5/src/linker/component_factory_resolver.js +7 -1
- package/esm5/src/metadata/di.js +1 -1
- package/esm5/src/metadata/directives.js +4 -3
- package/esm5/src/reflection/reflection_capabilities.js +2 -2
- package/esm5/src/render3/component.js +5 -2
- package/esm5/src/render3/component_ref.js +13 -9
- package/esm5/src/render3/di.js +4 -5
- package/esm5/src/render3/features/providers_feature.js +6 -3
- package/esm5/src/render3/i18n.js +15 -10
- package/esm5/src/render3/index.js +2 -2
- package/esm5/src/render3/instructions/attribute.js +5 -4
- package/esm5/src/render3/instructions/embedded_view.js +5 -2
- package/esm5/src/render3/instructions/property.js +7 -7
- package/esm5/src/render3/instructions/shared.js +27 -5
- package/esm5/src/render3/instructions/text.js +12 -17
- package/esm5/src/render3/instructions/text_interpolation.js +49 -12
- package/esm5/src/render3/interfaces/container.js +3 -2
- package/esm5/src/render3/interfaces/i18n.js +1 -1
- package/esm5/src/render3/interfaces/node.js +1 -1
- package/esm5/src/render3/interfaces/view.js +1 -1
- package/esm5/src/render3/jit/environment.js +1 -2
- package/esm5/src/render3/node_manipulation.js +200 -192
- package/esm5/src/render3/query.js +10 -8
- package/esm5/src/render3/state.js +6 -3
- package/esm5/src/render3/util/misc_utils.js +1 -1
- package/esm5/src/render3/util/view_traversal_utils.js +7 -2
- package/esm5/src/render3/view_engine_compatibility.js +32 -12
- package/esm5/src/util/assert.js +3 -2
- package/esm5/src/util/decorators.js +1 -1
- package/esm5/src/version.js +1 -1
- package/esm5/testing/src/test_bed_common.js +1 -1
- package/fesm2015/core.js +483 -296
- package/fesm2015/core.js.map +1 -1
- package/fesm2015/testing.js +1 -1
- package/fesm2015/testing.js.map +1 -1
- package/fesm5/core.js +395 -279
- package/fesm5/core.js.map +1 -1
- package/fesm5/testing.js +1 -1
- package/fesm5/testing.js.map +1 -1
- package/package.json +1 -1
- package/src/r3_symbols.d.ts +73 -90
- package/testing/testing.d.ts +5 -2
- package/testing.d.ts +1 -1
package/bundles/core.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v8.1.
|
|
2
|
+
* @license Angular v8.1.1
|
|
3
3
|
* (c) 2010-2019 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -947,7 +947,7 @@
|
|
|
947
947
|
if (typeof paramTypes === 'undefined') {
|
|
948
948
|
result[i] = [];
|
|
949
949
|
}
|
|
950
|
-
else if (paramTypes[i] != Object) {
|
|
950
|
+
else if (paramTypes[i] && paramTypes[i] != Object) {
|
|
951
951
|
result[i] = [paramTypes[i]];
|
|
952
952
|
}
|
|
953
953
|
else {
|
|
@@ -4000,7 +4000,7 @@
|
|
|
4000
4000
|
function assertDomNode(node) {
|
|
4001
4001
|
// If we're in a worker, `Node` will not be defined.
|
|
4002
4002
|
assertEqual((typeof Node !== 'undefined' && node instanceof Node) ||
|
|
4003
|
-
(typeof node === 'object' && node.constructor.name === 'WebWorkerRenderNode'), true,
|
|
4003
|
+
(typeof node === 'object' && node.constructor.name === 'WebWorkerRenderNode'), true, "The provided value must be an instance of a DOM Node but got " + stringify(node));
|
|
4004
4004
|
}
|
|
4005
4005
|
function assertDataInRange(arr, index) {
|
|
4006
4006
|
var maxLen = arr ? arr.length : 0;
|
|
@@ -4029,13 +4029,14 @@
|
|
|
4029
4029
|
// PARENT, NEXT, QUERIES and T_HOST are indices 3, 4, 5 and 6.
|
|
4030
4030
|
// As we already have these constants in LView, we don't need to re-create them.
|
|
4031
4031
|
var NATIVE = 7;
|
|
4032
|
+
var VIEW_REFS = 8;
|
|
4032
4033
|
/**
|
|
4033
4034
|
* Size of LContainer's header. Represents the index after which all views in the
|
|
4034
4035
|
* container will be inserted. We need to keep a record of current views so we know
|
|
4035
4036
|
* which views are already in the DOM (and don't need to be re-added) and so we can
|
|
4036
4037
|
* remove views from the DOM when they are no longer required.
|
|
4037
4038
|
*/
|
|
4038
|
-
var CONTAINER_HEADER_OFFSET =
|
|
4039
|
+
var CONTAINER_HEADER_OFFSET = 9;
|
|
4039
4040
|
|
|
4040
4041
|
/**
|
|
4041
4042
|
* @license
|
|
@@ -4888,8 +4889,11 @@
|
|
|
4888
4889
|
* the direction of traversal (up or down the view tree) a bit clearer.
|
|
4889
4890
|
*
|
|
4890
4891
|
* @param newView New state to become active
|
|
4892
|
+
* @param safeToRunHooks Whether the runtime is in a state where running lifecycle hooks is valid.
|
|
4893
|
+
* This is not always the case (for example, the application may have crashed and `leaveView` is
|
|
4894
|
+
* being executed while unwinding the call stack).
|
|
4891
4895
|
*/
|
|
4892
|
-
function leaveView(newView) {
|
|
4896
|
+
function leaveView(newView, safeToRunHooks) {
|
|
4893
4897
|
var tView = lView[TVIEW];
|
|
4894
4898
|
if (isCreationMode(lView)) {
|
|
4895
4899
|
lView[FLAGS] &= ~4 /* CreationMode */;
|
|
@@ -4897,7 +4901,7 @@
|
|
|
4897
4901
|
else {
|
|
4898
4902
|
try {
|
|
4899
4903
|
resetPreOrderHookFlags(lView);
|
|
4900
|
-
executeHooks(lView, tView.viewHooks, tView.viewCheckHooks, checkNoChangesMode, 2 /* AfterViewInitHooksToBeRun */, undefined);
|
|
4904
|
+
safeToRunHooks && executeHooks(lView, tView.viewHooks, tView.viewCheckHooks, checkNoChangesMode, 2 /* AfterViewInitHooksToBeRun */, undefined);
|
|
4901
4905
|
}
|
|
4902
4906
|
finally {
|
|
4903
4907
|
// Views are clean and in update mode after being checked, so these bits are cleared
|
|
@@ -6774,7 +6778,12 @@
|
|
|
6774
6778
|
return lView;
|
|
6775
6779
|
}
|
|
6776
6780
|
/**
|
|
6777
|
-
* Given
|
|
6781
|
+
* Given an `LView`, find the closest declaration view which is not an embedded view.
|
|
6782
|
+
*
|
|
6783
|
+
* This method searches for the `LView` associated with the component which declared the `LView`.
|
|
6784
|
+
*
|
|
6785
|
+
* This function may return itself if the `LView` passed in is not an embedded `LView`. Otherwise
|
|
6786
|
+
* it walks the declaration parents until it finds a component view (non-embedded-view.)
|
|
6778
6787
|
*
|
|
6779
6788
|
* @param lView LView for which we want a host element node
|
|
6780
6789
|
* @returns The host node
|
|
@@ -7225,7 +7234,7 @@
|
|
|
7225
7234
|
// This special case happens when there is a @host on the inject and when we are searching
|
|
7226
7235
|
// on the host element node.
|
|
7227
7236
|
var isHostSpecialCase = (flags & exports.InjectFlags.Host) && hostTElementNode === tNode;
|
|
7228
|
-
var injectableIdx = locateDirectiveOrProvider(tNode,
|
|
7237
|
+
var injectableIdx = locateDirectiveOrProvider(tNode, currentTView, token, canAccessViewProviders, isHostSpecialCase);
|
|
7229
7238
|
if (injectableIdx !== null) {
|
|
7230
7239
|
return getNodeInjectable(currentTView.data, lView, injectableIdx, tNode);
|
|
7231
7240
|
}
|
|
@@ -7237,14 +7246,13 @@
|
|
|
7237
7246
|
* Searches for the given token among the node's directives and providers.
|
|
7238
7247
|
*
|
|
7239
7248
|
* @param tNode TNode on which directives are present.
|
|
7240
|
-
* @param
|
|
7249
|
+
* @param tView The tView we are currently processing
|
|
7241
7250
|
* @param token Provider token or type of a directive to look for.
|
|
7242
7251
|
* @param canAccessViewProviders Whether view providers should be considered.
|
|
7243
7252
|
* @param isHostSpecialCase Whether the host special case applies.
|
|
7244
7253
|
* @returns Index of a found directive or provider, or null when none found.
|
|
7245
7254
|
*/
|
|
7246
|
-
function locateDirectiveOrProvider(tNode,
|
|
7247
|
-
var tView = lView[TVIEW];
|
|
7255
|
+
function locateDirectiveOrProvider(tNode, tView, token, canAccessViewProviders, isHostSpecialCase) {
|
|
7248
7256
|
var nodeProviderIndexes = tNode.providerIndexes;
|
|
7249
7257
|
var tInjectables = tView.data;
|
|
7250
7258
|
var injectablesStart = nodeProviderIndexes & 65535 /* ProvidersStartIndexMask */;
|
|
@@ -11457,6 +11465,8 @@
|
|
|
11457
11465
|
tickRootContext(getRootContext(viewToRender));
|
|
11458
11466
|
}
|
|
11459
11467
|
else {
|
|
11468
|
+
// Will become true if the `try` block executes with no errors.
|
|
11469
|
+
var safeToRunHooks = false;
|
|
11460
11470
|
try {
|
|
11461
11471
|
setPreviousOrParentTNode(null, true);
|
|
11462
11472
|
oldView = enterView(viewToRender, viewToRender[T_HOST]);
|
|
@@ -11468,9 +11478,10 @@
|
|
|
11468
11478
|
// matching, etc again and again.
|
|
11469
11479
|
viewToRender[TVIEW].firstTemplatePass = false;
|
|
11470
11480
|
refreshDescendantViews(viewToRender);
|
|
11481
|
+
safeToRunHooks = true;
|
|
11471
11482
|
}
|
|
11472
11483
|
finally {
|
|
11473
|
-
leaveView(oldView);
|
|
11484
|
+
leaveView(oldView, safeToRunHooks);
|
|
11474
11485
|
setPreviousOrParentTNode(_previousOrParentTNode, _isParent);
|
|
11475
11486
|
}
|
|
11476
11487
|
}
|
|
@@ -11480,6 +11491,8 @@
|
|
|
11480
11491
|
var oldView = enterView(hostView, hostView[T_HOST]);
|
|
11481
11492
|
var normalExecutionPath = !getCheckNoChangesMode();
|
|
11482
11493
|
var creationModeIsActive = isCreationMode(hostView);
|
|
11494
|
+
// Will become true if the `try` block executes with no errors.
|
|
11495
|
+
var safeToRunHooks = false;
|
|
11483
11496
|
try {
|
|
11484
11497
|
if (normalExecutionPath && !creationModeIsActive && rendererFactory.begin) {
|
|
11485
11498
|
rendererFactory.begin();
|
|
@@ -11494,12 +11507,13 @@
|
|
|
11494
11507
|
resetPreOrderHookFlags(hostView);
|
|
11495
11508
|
templateFn && executeTemplate(hostView, templateFn, 2 /* Update */, context);
|
|
11496
11509
|
refreshDescendantViews(hostView);
|
|
11510
|
+
safeToRunHooks = true;
|
|
11497
11511
|
}
|
|
11498
11512
|
finally {
|
|
11499
11513
|
if (normalExecutionPath && !creationModeIsActive && rendererFactory.end) {
|
|
11500
11514
|
rendererFactory.end();
|
|
11501
11515
|
}
|
|
11502
|
-
leaveView(oldView);
|
|
11516
|
+
leaveView(oldView, safeToRunHooks);
|
|
11503
11517
|
}
|
|
11504
11518
|
}
|
|
11505
11519
|
function executeTemplate(lView, templateFn, rf, context) {
|
|
@@ -12374,7 +12388,8 @@
|
|
|
12374
12388
|
null, // next
|
|
12375
12389
|
null, // queries
|
|
12376
12390
|
tNode, // t_host
|
|
12377
|
-
native
|
|
12391
|
+
native, // native,
|
|
12392
|
+
null);
|
|
12378
12393
|
ngDevMode && attachLContainerDebug(lContainer);
|
|
12379
12394
|
return lContainer;
|
|
12380
12395
|
}
|
|
@@ -12606,6 +12621,8 @@
|
|
|
12606
12621
|
var oldView = enterView(hostView, hostView[T_HOST]);
|
|
12607
12622
|
var templateFn = hostTView.template;
|
|
12608
12623
|
var creationMode = isCreationMode(hostView);
|
|
12624
|
+
// Will become true if the `try` block executes with no errors.
|
|
12625
|
+
var safeToRunHooks = false;
|
|
12609
12626
|
try {
|
|
12610
12627
|
resetPreOrderHookFlags(hostView);
|
|
12611
12628
|
creationMode && executeViewQueryFn(1 /* Create */, hostTView, component);
|
|
@@ -12615,9 +12632,10 @@
|
|
|
12615
12632
|
if (!creationMode || hostTView.staticViewQueries) {
|
|
12616
12633
|
executeViewQueryFn(2 /* Update */, hostTView, component);
|
|
12617
12634
|
}
|
|
12635
|
+
safeToRunHooks = true;
|
|
12618
12636
|
}
|
|
12619
12637
|
finally {
|
|
12620
|
-
leaveView(oldView);
|
|
12638
|
+
leaveView(oldView, safeToRunHooks);
|
|
12621
12639
|
}
|
|
12622
12640
|
}
|
|
12623
12641
|
function executeViewQueryFn(flags, tView, component) {
|
|
@@ -12711,6 +12729,18 @@
|
|
|
12711
12729
|
}
|
|
12712
12730
|
}
|
|
12713
12731
|
}
|
|
12732
|
+
/**
|
|
12733
|
+
* Updates a text binding at a given index in a given LView.
|
|
12734
|
+
*/
|
|
12735
|
+
function textBindingInternal(lView, index, value) {
|
|
12736
|
+
ngDevMode && assertNotSame(value, NO_CHANGE, 'value should not be NO_CHANGE');
|
|
12737
|
+
ngDevMode && assertDataInRange(lView, index + HEADER_OFFSET);
|
|
12738
|
+
var element = getNativeByIndex(index, lView);
|
|
12739
|
+
ngDevMode && assertDefined(element, 'native element should exist');
|
|
12740
|
+
ngDevMode && ngDevMode.rendererSetText++;
|
|
12741
|
+
var renderer = lView[RENDERER];
|
|
12742
|
+
isProceduralRenderer(renderer) ? renderer.setValue(element, value) : element.textContent = value;
|
|
12743
|
+
}
|
|
12714
12744
|
|
|
12715
12745
|
/**
|
|
12716
12746
|
* @license
|
|
@@ -13055,7 +13085,8 @@
|
|
|
13055
13085
|
function ɵɵproperty(propName, value, sanitizer, nativeOnly) {
|
|
13056
13086
|
var index = getSelectedIndex();
|
|
13057
13087
|
ngDevMode && assertNotEqual(index, -1, 'selected index cannot be -1');
|
|
13058
|
-
var
|
|
13088
|
+
var lView = getLView();
|
|
13089
|
+
var bindReconciledValue = bind(lView, value);
|
|
13059
13090
|
if (bindReconciledValue !== NO_CHANGE) {
|
|
13060
13091
|
elementPropertyInternal(index, propName, bindReconciledValue, sanitizer, nativeOnly);
|
|
13061
13092
|
}
|
|
@@ -13064,12 +13095,10 @@
|
|
|
13064
13095
|
/**
|
|
13065
13096
|
* Creates a single value binding.
|
|
13066
13097
|
*
|
|
13098
|
+
* @param lView Current view
|
|
13067
13099
|
* @param value Value to diff
|
|
13068
|
-
*
|
|
13069
|
-
* @codeGenApi
|
|
13070
13100
|
*/
|
|
13071
|
-
function
|
|
13072
|
-
var lView = getLView();
|
|
13101
|
+
function bind(lView, value) {
|
|
13073
13102
|
var bindingIndex = lView[BINDING_INDEX]++;
|
|
13074
13103
|
storeBindingMetadata(lView);
|
|
13075
13104
|
return bindingUpdated(lView, bindingIndex, value) ? value : NO_CHANGE;
|
|
@@ -13099,8 +13128,9 @@
|
|
|
13099
13128
|
*/
|
|
13100
13129
|
function ɵɵupdateSyntheticHostBinding(propName, value, sanitizer, nativeOnly) {
|
|
13101
13130
|
var index = getSelectedIndex();
|
|
13131
|
+
var lView = getLView();
|
|
13102
13132
|
// TODO(benlesh): remove bind call here.
|
|
13103
|
-
var bound =
|
|
13133
|
+
var bound = bind(lView, value);
|
|
13104
13134
|
if (bound !== NO_CHANGE) {
|
|
13105
13135
|
elementPropertyInternal(index, propName, bound, sanitizer, nativeOnly, loadComponentRenderer);
|
|
13106
13136
|
}
|
|
@@ -13123,10 +13153,11 @@
|
|
|
13123
13153
|
var index = getSelectedIndex();
|
|
13124
13154
|
var lView = getLView();
|
|
13125
13155
|
// TODO(FW-1340): Refactor to remove the use of other instructions here.
|
|
13126
|
-
var bound =
|
|
13156
|
+
var bound = bind(lView, value);
|
|
13127
13157
|
if (bound !== NO_CHANGE) {
|
|
13128
|
-
|
|
13158
|
+
elementAttributeInternal(index, name, bound, lView, sanitizer, namespace);
|
|
13129
13159
|
}
|
|
13160
|
+
return ɵɵattribute;
|
|
13130
13161
|
}
|
|
13131
13162
|
|
|
13132
13163
|
/**
|
|
@@ -13812,193 +13843,52 @@
|
|
|
13812
13843
|
var container = getLContainer(tViewNode, view);
|
|
13813
13844
|
return container ? nativeParentNode(view[RENDERER], container[NATIVE]) : null;
|
|
13814
13845
|
}
|
|
13815
|
-
/**
|
|
13816
|
-
* Stack used to keep track of projection nodes in walkTNodeTree.
|
|
13817
|
-
*
|
|
13818
|
-
* This is deliberately created outside of walkTNodeTree to avoid allocating
|
|
13819
|
-
* a new array each time the function is called. Instead the array will be
|
|
13820
|
-
* re-used by each invocation. This works because the function is not reentrant.
|
|
13821
|
-
*/
|
|
13822
|
-
var projectionNodeStack = [];
|
|
13823
|
-
/**
|
|
13824
|
-
* Walks a tree of TNodes, applying a transformation on the element nodes, either only on the first
|
|
13825
|
-
* one found, or on all of them.
|
|
13826
|
-
*
|
|
13827
|
-
* @param viewToWalk the view to walk
|
|
13828
|
-
* @param action identifies the action to be performed on the elements
|
|
13829
|
-
* @param renderer the current renderer.
|
|
13830
|
-
* @param renderParent Optional the render parent node to be set in all LContainers found,
|
|
13831
|
-
* required for action modes Insert and Destroy.
|
|
13832
|
-
* @param beforeNode Optional the node before which elements should be added, required for action
|
|
13833
|
-
* Insert.
|
|
13834
|
-
*/
|
|
13835
|
-
function walkTNodeTree(viewToWalk, action, renderer, renderParent, beforeNode) {
|
|
13836
|
-
var e_1, _a;
|
|
13837
|
-
var rootTNode = viewToWalk[TVIEW].node;
|
|
13838
|
-
var projectionNodeIndex = -1;
|
|
13839
|
-
var currentView = viewToWalk;
|
|
13840
|
-
var tNode = rootTNode.child;
|
|
13841
|
-
while (tNode) {
|
|
13842
|
-
var nextTNode = null;
|
|
13843
|
-
if (tNode.type === 3 /* Element */ || tNode.type === 4 /* ElementContainer */) {
|
|
13844
|
-
executeNodeAction(action, renderer, renderParent, getNativeByTNode(tNode, currentView), tNode, beforeNode);
|
|
13845
|
-
var nodeOrContainer = currentView[tNode.index];
|
|
13846
|
-
if (isLContainer(nodeOrContainer)) {
|
|
13847
|
-
// This element has an LContainer, and its comment needs to be handled
|
|
13848
|
-
executeNodeAction(action, renderer, renderParent, nodeOrContainer[NATIVE], tNode, beforeNode);
|
|
13849
|
-
var firstView = nodeOrContainer[CONTAINER_HEADER_OFFSET];
|
|
13850
|
-
if (firstView) {
|
|
13851
|
-
currentView = firstView;
|
|
13852
|
-
nextTNode = currentView[TVIEW].node;
|
|
13853
|
-
// When the walker enters a container, then the beforeNode has to become the local native
|
|
13854
|
-
// comment node.
|
|
13855
|
-
beforeNode = nodeOrContainer[NATIVE];
|
|
13856
|
-
}
|
|
13857
|
-
}
|
|
13858
|
-
}
|
|
13859
|
-
else if (tNode.type === 0 /* Container */) {
|
|
13860
|
-
var lContainer = currentView[tNode.index];
|
|
13861
|
-
executeNodeAction(action, renderer, renderParent, lContainer[NATIVE], tNode, beforeNode);
|
|
13862
|
-
var firstView = lContainer[CONTAINER_HEADER_OFFSET];
|
|
13863
|
-
if (firstView) {
|
|
13864
|
-
currentView = firstView;
|
|
13865
|
-
nextTNode = currentView[TVIEW].node;
|
|
13866
|
-
// When the walker enters a container, then the beforeNode has to become the local native
|
|
13867
|
-
// comment node.
|
|
13868
|
-
beforeNode = lContainer[NATIVE];
|
|
13869
|
-
}
|
|
13870
|
-
}
|
|
13871
|
-
else if (tNode.type === 1 /* Projection */) {
|
|
13872
|
-
var componentView = findComponentView(currentView);
|
|
13873
|
-
var componentHost = componentView[T_HOST];
|
|
13874
|
-
var head = componentHost.projection[tNode.projection];
|
|
13875
|
-
if (Array.isArray(head)) {
|
|
13876
|
-
try {
|
|
13877
|
-
for (var head_1 = __values(head), head_1_1 = head_1.next(); !head_1_1.done; head_1_1 = head_1.next()) {
|
|
13878
|
-
var nativeNode = head_1_1.value;
|
|
13879
|
-
executeNodeAction(action, renderer, renderParent, nativeNode, tNode, beforeNode);
|
|
13880
|
-
}
|
|
13881
|
-
}
|
|
13882
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
13883
|
-
finally {
|
|
13884
|
-
try {
|
|
13885
|
-
if (head_1_1 && !head_1_1.done && (_a = head_1.return)) _a.call(head_1);
|
|
13886
|
-
}
|
|
13887
|
-
finally { if (e_1) throw e_1.error; }
|
|
13888
|
-
}
|
|
13889
|
-
}
|
|
13890
|
-
else {
|
|
13891
|
-
// Must store both the TNode and the view because this projection node could be nested
|
|
13892
|
-
// deeply inside embedded views, and we need to get back down to this particular nested
|
|
13893
|
-
// view.
|
|
13894
|
-
projectionNodeStack[++projectionNodeIndex] = tNode;
|
|
13895
|
-
projectionNodeStack[++projectionNodeIndex] = currentView;
|
|
13896
|
-
if (head) {
|
|
13897
|
-
currentView = componentView[PARENT];
|
|
13898
|
-
nextTNode = currentView[TVIEW].data[head.index];
|
|
13899
|
-
}
|
|
13900
|
-
}
|
|
13901
|
-
}
|
|
13902
|
-
else {
|
|
13903
|
-
// Otherwise, this is a View
|
|
13904
|
-
nextTNode = tNode.child;
|
|
13905
|
-
}
|
|
13906
|
-
if (nextTNode === null) {
|
|
13907
|
-
// this last node was projected, we need to get back down to its projection node
|
|
13908
|
-
if (tNode.projectionNext === null && (tNode.flags & 2 /* isProjected */)) {
|
|
13909
|
-
currentView = projectionNodeStack[projectionNodeIndex--];
|
|
13910
|
-
tNode = projectionNodeStack[projectionNodeIndex--];
|
|
13911
|
-
}
|
|
13912
|
-
if (tNode.flags & 2 /* isProjected */) {
|
|
13913
|
-
nextTNode = tNode.projectionNext;
|
|
13914
|
-
}
|
|
13915
|
-
else if (tNode.type === 4 /* ElementContainer */) {
|
|
13916
|
-
nextTNode = tNode.child || tNode.next;
|
|
13917
|
-
}
|
|
13918
|
-
else {
|
|
13919
|
-
nextTNode = tNode.next;
|
|
13920
|
-
}
|
|
13921
|
-
/**
|
|
13922
|
-
* Find the next node in the TNode tree, taking into account the place where a node is
|
|
13923
|
-
* projected (in the shadow DOM) rather than where it comes from (in the light DOM).
|
|
13924
|
-
*
|
|
13925
|
-
* If there is no sibling node, then it goes to the next sibling of the parent node...
|
|
13926
|
-
* until it reaches rootNode (at which point null is returned).
|
|
13927
|
-
*/
|
|
13928
|
-
while (!nextTNode) {
|
|
13929
|
-
// If parent is null, we're crossing the view boundary, so we should get the host TNode.
|
|
13930
|
-
tNode = tNode.parent || currentView[T_HOST];
|
|
13931
|
-
if (tNode === null || tNode === rootTNode)
|
|
13932
|
-
return;
|
|
13933
|
-
// When exiting a container, the beforeNode must be restored to the previous value
|
|
13934
|
-
if (tNode.type === 0 /* Container */) {
|
|
13935
|
-
currentView = getLViewParent(currentView);
|
|
13936
|
-
beforeNode = currentView[tNode.index][NATIVE];
|
|
13937
|
-
}
|
|
13938
|
-
if (tNode.type === 2 /* View */) {
|
|
13939
|
-
/**
|
|
13940
|
-
* If current lView doesn't have next pointer, we try to find it by going up parents
|
|
13941
|
-
* chain until:
|
|
13942
|
-
* - we find an lView with a next pointer
|
|
13943
|
-
* - or find a tNode with a parent that has a next pointer
|
|
13944
|
-
* - or find a lContainer
|
|
13945
|
-
* - or reach root TNode (in which case we exit, since we traversed all nodes)
|
|
13946
|
-
*/
|
|
13947
|
-
while (!currentView[NEXT] && currentView[PARENT] &&
|
|
13948
|
-
!(tNode.parent && tNode.parent.next)) {
|
|
13949
|
-
if (tNode === rootTNode)
|
|
13950
|
-
return;
|
|
13951
|
-
currentView = currentView[PARENT];
|
|
13952
|
-
if (isLContainer(currentView)) {
|
|
13953
|
-
tNode = currentView[T_HOST];
|
|
13954
|
-
currentView = currentView[PARENT];
|
|
13955
|
-
beforeNode = currentView[tNode.index][NATIVE];
|
|
13956
|
-
break;
|
|
13957
|
-
}
|
|
13958
|
-
tNode = currentView[T_HOST];
|
|
13959
|
-
}
|
|
13960
|
-
if (currentView[NEXT]) {
|
|
13961
|
-
currentView = currentView[NEXT];
|
|
13962
|
-
nextTNode = currentView[T_HOST];
|
|
13963
|
-
}
|
|
13964
|
-
else {
|
|
13965
|
-
nextTNode = tNode.type === 4 /* ElementContainer */ && tNode.child || tNode.next;
|
|
13966
|
-
}
|
|
13967
|
-
}
|
|
13968
|
-
else {
|
|
13969
|
-
nextTNode = tNode.next;
|
|
13970
|
-
}
|
|
13971
|
-
}
|
|
13972
|
-
}
|
|
13973
|
-
tNode = nextTNode;
|
|
13974
|
-
}
|
|
13975
|
-
}
|
|
13976
13846
|
/**
|
|
13977
13847
|
* NOTE: for performance reasons, the possible actions are inlined within the function instead of
|
|
13978
13848
|
* being passed as an argument.
|
|
13979
13849
|
*/
|
|
13980
|
-
function
|
|
13850
|
+
function executeActionOnElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode) {
|
|
13851
|
+
ngDevMode && assertDefined(lNodeToHandle, '\'lNodeToHandle\' is undefined');
|
|
13852
|
+
var lContainer;
|
|
13853
|
+
var isComponent = false;
|
|
13854
|
+
// We are expecting an RNode, but in the case of a component or LContainer the `RNode` is wrapped
|
|
13855
|
+
// in an array which needs to be unwrapped. We need to know if it is a component and if
|
|
13856
|
+
// it has LContainer so that we can process all of those cases appropriately.
|
|
13857
|
+
if (isLContainer(lNodeToHandle)) {
|
|
13858
|
+
lContainer = lNodeToHandle;
|
|
13859
|
+
}
|
|
13860
|
+
else if (isLView(lNodeToHandle)) {
|
|
13861
|
+
isComponent = true;
|
|
13862
|
+
ngDevMode && assertDefined(lNodeToHandle[HOST], 'HOST must be defined for a component LView');
|
|
13863
|
+
lNodeToHandle = lNodeToHandle[HOST];
|
|
13864
|
+
}
|
|
13865
|
+
var rNode = unwrapRNode(lNodeToHandle);
|
|
13866
|
+
ngDevMode && assertDomNode(rNode);
|
|
13981
13867
|
if (action === 0 /* Insert */) {
|
|
13982
|
-
nativeInsertBefore(renderer, parent,
|
|
13868
|
+
nativeInsertBefore(renderer, parent, rNode, beforeNode || null);
|
|
13983
13869
|
}
|
|
13984
13870
|
else if (action === 1 /* Detach */) {
|
|
13985
|
-
nativeRemoveNode(renderer,
|
|
13871
|
+
nativeRemoveNode(renderer, rNode, isComponent);
|
|
13986
13872
|
}
|
|
13987
13873
|
else if (action === 2 /* Destroy */) {
|
|
13988
13874
|
ngDevMode && ngDevMode.rendererDestroyNode++;
|
|
13989
|
-
renderer.destroyNode(
|
|
13875
|
+
renderer.destroyNode(rNode);
|
|
13876
|
+
}
|
|
13877
|
+
if (lContainer != null) {
|
|
13878
|
+
executeActionOnContainer(renderer, action, lContainer, parent, beforeNode);
|
|
13990
13879
|
}
|
|
13991
13880
|
}
|
|
13992
13881
|
function createTextNode(value, renderer) {
|
|
13993
13882
|
return isProceduralRenderer(renderer) ? renderer.createText(renderStringify(value)) :
|
|
13994
13883
|
renderer.createTextNode(renderStringify(value));
|
|
13995
13884
|
}
|
|
13996
|
-
function addRemoveViewFromContainer(
|
|
13997
|
-
var renderParent = getContainerRenderParent(
|
|
13998
|
-
ngDevMode && assertNodeType(
|
|
13885
|
+
function addRemoveViewFromContainer(lView, insertMode, beforeNode) {
|
|
13886
|
+
var renderParent = getContainerRenderParent(lView[TVIEW].node, lView);
|
|
13887
|
+
ngDevMode && assertNodeType(lView[TVIEW].node, 2 /* View */);
|
|
13999
13888
|
if (renderParent) {
|
|
14000
|
-
var renderer =
|
|
14001
|
-
|
|
13889
|
+
var renderer = lView[RENDERER];
|
|
13890
|
+
var action = insertMode ? 0 /* Insert */ : 1 /* Detach */;
|
|
13891
|
+
executeActionOnView(renderer, action, lView, renderParent, beforeNode);
|
|
14002
13892
|
}
|
|
14003
13893
|
}
|
|
14004
13894
|
/**
|
|
@@ -14007,7 +13897,7 @@
|
|
|
14007
13897
|
* @param lView the `LView` to be detached.
|
|
14008
13898
|
*/
|
|
14009
13899
|
function renderDetachView(lView) {
|
|
14010
|
-
|
|
13900
|
+
executeActionOnView(lView[RENDERER], 1 /* Detach */, lView, null, null);
|
|
14011
13901
|
}
|
|
14012
13902
|
/**
|
|
14013
13903
|
* Traverses down and up the tree of views and containers to remove listeners and
|
|
@@ -14137,15 +14027,15 @@
|
|
|
14137
14027
|
* A standalone function which destroys an LView,
|
|
14138
14028
|
* conducting cleanup (e.g. removing listeners, calling onDestroys).
|
|
14139
14029
|
*
|
|
14140
|
-
* @param
|
|
14030
|
+
* @param lView The view to be destroyed.
|
|
14141
14031
|
*/
|
|
14142
|
-
function destroyLView(
|
|
14143
|
-
if (!(
|
|
14144
|
-
var renderer =
|
|
14032
|
+
function destroyLView(lView) {
|
|
14033
|
+
if (!(lView[FLAGS] & 256 /* Destroyed */)) {
|
|
14034
|
+
var renderer = lView[RENDERER];
|
|
14145
14035
|
if (isProceduralRenderer(renderer) && renderer.destroyNode) {
|
|
14146
|
-
|
|
14036
|
+
executeActionOnView(renderer, 2 /* Destroy */, lView, null, null);
|
|
14147
14037
|
}
|
|
14148
|
-
destroyViewTree(
|
|
14038
|
+
destroyViewTree(lView);
|
|
14149
14039
|
}
|
|
14150
14040
|
}
|
|
14151
14041
|
/**
|
|
@@ -14208,7 +14098,7 @@
|
|
|
14208
14098
|
/** Removes listeners and unsubscribes from output subscriptions */
|
|
14209
14099
|
function removeListeners(lView) {
|
|
14210
14100
|
var tCleanup = lView[TVIEW].cleanup;
|
|
14211
|
-
if (tCleanup
|
|
14101
|
+
if (tCleanup !== null) {
|
|
14212
14102
|
var lCleanup = lView[CLEANUP];
|
|
14213
14103
|
for (var i = 0; i < tCleanup.length - 1; i += 2) {
|
|
14214
14104
|
if (typeof tCleanup[i] === 'string') {
|
|
@@ -14360,7 +14250,7 @@
|
|
|
14360
14250
|
}
|
|
14361
14251
|
}
|
|
14362
14252
|
function nativeAppendOrInsertBefore(renderer, parent, child, beforeNode) {
|
|
14363
|
-
if (beforeNode) {
|
|
14253
|
+
if (beforeNode !== null) {
|
|
14364
14254
|
nativeInsertBefore(renderer, parent, child, beforeNode);
|
|
14365
14255
|
}
|
|
14366
14256
|
else {
|
|
@@ -14417,7 +14307,7 @@
|
|
|
14417
14307
|
* @returns Whether or not the child was appended
|
|
14418
14308
|
*/
|
|
14419
14309
|
function appendChild(childEl, childTNode, currentView) {
|
|
14420
|
-
var
|
|
14310
|
+
var e_1, _a;
|
|
14421
14311
|
var renderParent = getRenderParent(childTNode, currentView);
|
|
14422
14312
|
if (renderParent != null) {
|
|
14423
14313
|
var renderer = currentView[RENDERER];
|
|
@@ -14430,12 +14320,12 @@
|
|
|
14430
14320
|
nativeAppendOrInsertBefore(renderer, renderParent, nativeNode, anchorNode);
|
|
14431
14321
|
}
|
|
14432
14322
|
}
|
|
14433
|
-
catch (
|
|
14323
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
14434
14324
|
finally {
|
|
14435
14325
|
try {
|
|
14436
14326
|
if (childEl_1_1 && !childEl_1_1.done && (_a = childEl_1.return)) _a.call(childEl_1);
|
|
14437
14327
|
}
|
|
14438
|
-
finally { if (
|
|
14328
|
+
finally { if (e_1) throw e_1.error; }
|
|
14439
14329
|
}
|
|
14440
14330
|
}
|
|
14441
14331
|
else {
|
|
@@ -14460,6 +14350,7 @@
|
|
|
14460
14350
|
var nextViewIndex = CONTAINER_HEADER_OFFSET + viewIndexInContainer + 1;
|
|
14461
14351
|
if (nextViewIndex < lContainer.length) {
|
|
14462
14352
|
var lView = lContainer[nextViewIndex];
|
|
14353
|
+
ngDevMode && assertDefined(lView[T_HOST], 'Missing Host TNode');
|
|
14463
14354
|
var tViewNodeChild = lView[T_HOST].child;
|
|
14464
14355
|
return tViewNodeChild !== null ? getNativeByTNode(tViewNodeChild, lView) : lContainer[NATIVE];
|
|
14465
14356
|
}
|
|
@@ -14485,7 +14376,7 @@
|
|
|
14485
14376
|
/**
|
|
14486
14377
|
* Appends nodes to a target projection place. Nodes to insert were previously re-distribution and
|
|
14487
14378
|
* stored on a component host level.
|
|
14488
|
-
* @param lView A LView where nodes are inserted (target
|
|
14379
|
+
* @param lView A LView where nodes are inserted (target LView)
|
|
14489
14380
|
* @param tProjectionNode A projection node where previously re-distribution should be appended
|
|
14490
14381
|
* (target insertion place)
|
|
14491
14382
|
* @param selectorIndex A bucket from where nodes to project should be taken
|
|
@@ -14515,6 +14406,20 @@
|
|
|
14515
14406
|
}
|
|
14516
14407
|
}
|
|
14517
14408
|
}
|
|
14409
|
+
/**
|
|
14410
|
+
* Loops over all children of a TNode container and appends them to the DOM
|
|
14411
|
+
*
|
|
14412
|
+
* @param ngContainerChildTNode The first child of the TNode container
|
|
14413
|
+
* @param tProjectionNode The projection (ng-content) TNode
|
|
14414
|
+
* @param currentView Current LView
|
|
14415
|
+
* @param projectionView Projection view (view above current)
|
|
14416
|
+
*/
|
|
14417
|
+
function appendProjectedChildren(ngContainerChildTNode, tProjectionNode, currentView, projectionView) {
|
|
14418
|
+
while (ngContainerChildTNode) {
|
|
14419
|
+
appendProjectedNode(ngContainerChildTNode, tProjectionNode, currentView, projectionView);
|
|
14420
|
+
ngContainerChildTNode = ngContainerChildTNode.next;
|
|
14421
|
+
}
|
|
14422
|
+
}
|
|
14518
14423
|
/**
|
|
14519
14424
|
* Appends a projected node to the DOM, or in the case of a projected container,
|
|
14520
14425
|
* appends the nodes from all of the container's active views to the DOM.
|
|
@@ -14542,19 +14447,152 @@
|
|
|
14542
14447
|
addRemoveViewFromContainer(nodeOrContainer[i], true, nodeOrContainer[NATIVE]);
|
|
14543
14448
|
}
|
|
14544
14449
|
}
|
|
14450
|
+
else if (projectedTNode.type === 5 /* IcuContainer */) {
|
|
14451
|
+
// The node we are adding is an ICU container which is why we also need to project all the
|
|
14452
|
+
// children nodes that might have been created previously and are linked to this anchor
|
|
14453
|
+
var ngContainerChildTNode = projectedTNode.child;
|
|
14454
|
+
appendProjectedChildren(ngContainerChildTNode, ngContainerChildTNode, projectionView, projectionView);
|
|
14455
|
+
}
|
|
14545
14456
|
else {
|
|
14546
14457
|
if (projectedTNode.type === 4 /* ElementContainer */) {
|
|
14547
|
-
|
|
14548
|
-
while (ngContainerChildTNode) {
|
|
14549
|
-
appendProjectedNode(ngContainerChildTNode, tProjectionNode, currentView, projectionView);
|
|
14550
|
-
ngContainerChildTNode = ngContainerChildTNode.next;
|
|
14551
|
-
}
|
|
14458
|
+
appendProjectedChildren(projectedTNode.child, tProjectionNode, currentView, projectionView);
|
|
14552
14459
|
}
|
|
14553
14460
|
if (isLContainer(nodeOrContainer)) {
|
|
14554
14461
|
appendChild(nodeOrContainer[NATIVE], tProjectionNode, currentView);
|
|
14555
14462
|
}
|
|
14556
14463
|
}
|
|
14557
14464
|
}
|
|
14465
|
+
/**
|
|
14466
|
+
* `executeActionOnView` performs an operation on the view as specified in `action` (insert, detach,
|
|
14467
|
+
* destroy)
|
|
14468
|
+
*
|
|
14469
|
+
* Inserting a view without projection or containers at top level is simple. Just iterate over the
|
|
14470
|
+
* root nodes of the View, and for each node perform the `action`.
|
|
14471
|
+
*
|
|
14472
|
+
* Things get more complicated with containers and projections. That is because coming across:
|
|
14473
|
+
* - Container: implies that we have to insert/remove/destroy the views of that container as well
|
|
14474
|
+
* which in turn can have their own Containers at the View roots.
|
|
14475
|
+
* - Projection: implies that we have to insert/remove/destroy the nodes of the projection. The
|
|
14476
|
+
* complication is that the nodes we are projecting can themselves have Containers
|
|
14477
|
+
* or other Projections.
|
|
14478
|
+
*
|
|
14479
|
+
* As you can see this is a very recursive problem. While the recursive implementation is not the
|
|
14480
|
+
* most efficient one, trying to unroll the nodes non-recursively results in very complex code that
|
|
14481
|
+
* is very hard (to maintain). We are sacrificing a bit of performance for readability using a
|
|
14482
|
+
* recursive implementation.
|
|
14483
|
+
*
|
|
14484
|
+
* @param renderer Renderer to use
|
|
14485
|
+
* @param action action to perform (insert, detach, destroy)
|
|
14486
|
+
* @param lView The LView which needs to be inserted, detached, destroyed.
|
|
14487
|
+
* @param renderParent parent DOM element for insertion/removal.
|
|
14488
|
+
* @param beforeNode Before which node the insertions should happen.
|
|
14489
|
+
*/
|
|
14490
|
+
function executeActionOnView(renderer, action, lView, renderParent, beforeNode) {
|
|
14491
|
+
var tView = lView[TVIEW];
|
|
14492
|
+
ngDevMode && assertNodeType(tView.node, 2 /* View */);
|
|
14493
|
+
var viewRootTNode = tView.node.child;
|
|
14494
|
+
while (viewRootTNode !== null) {
|
|
14495
|
+
executeActionOnNode(renderer, action, lView, viewRootTNode, renderParent, beforeNode);
|
|
14496
|
+
viewRootTNode = viewRootTNode.next;
|
|
14497
|
+
}
|
|
14498
|
+
}
|
|
14499
|
+
/**
|
|
14500
|
+
* `executeActionOnProjection` performs an operation on the projection specified by `action`
|
|
14501
|
+
* (insert, detach, destroy).
|
|
14502
|
+
*
|
|
14503
|
+
* Inserting a projection requires us to locate the projected nodes from the parent component. The
|
|
14504
|
+
* complication is that those nodes themselves could be re-projected from their parent component.
|
|
14505
|
+
*
|
|
14506
|
+
* @param renderer Renderer to use
|
|
14507
|
+
* @param action action to perform (insert, detach, destroy)
|
|
14508
|
+
* @param lView The LView which needs to be inserted, detached, destroyed.
|
|
14509
|
+
* @param renderParent parent DOM element for insertion/removal.
|
|
14510
|
+
* @param beforeNode Before which node the insertions should happen.
|
|
14511
|
+
*/
|
|
14512
|
+
function executeActionOnProjection(renderer, action, lView, tProjectionNode, renderParent, beforeNode) {
|
|
14513
|
+
var componentLView = findComponentView(lView);
|
|
14514
|
+
var componentNode = componentLView[T_HOST];
|
|
14515
|
+
var nodeToProject = componentNode.projection[tProjectionNode.projection];
|
|
14516
|
+
if (Array.isArray(nodeToProject)) {
|
|
14517
|
+
for (var i = 0; i < nodeToProject.length; i++) {
|
|
14518
|
+
var rNode = nodeToProject[i];
|
|
14519
|
+
ngDevMode && assertDomNode(rNode);
|
|
14520
|
+
executeActionOnElementOrContainer(action, renderer, renderParent, rNode, beforeNode);
|
|
14521
|
+
}
|
|
14522
|
+
}
|
|
14523
|
+
else {
|
|
14524
|
+
var projectionTNode = nodeToProject;
|
|
14525
|
+
var projectedComponentLView = componentLView[PARENT];
|
|
14526
|
+
while (projectionTNode !== null) {
|
|
14527
|
+
executeActionOnNode(renderer, action, projectedComponentLView, projectionTNode, renderParent, beforeNode);
|
|
14528
|
+
projectionTNode = projectionTNode.projectionNext;
|
|
14529
|
+
}
|
|
14530
|
+
}
|
|
14531
|
+
}
|
|
14532
|
+
/**
|
|
14533
|
+
* `executeActionOnContainer` performs an operation on the container and its views as specified by
|
|
14534
|
+
* `action` (insert, detach, destroy)
|
|
14535
|
+
*
|
|
14536
|
+
* Inserting a Container is complicated by the fact that the container may have Views which
|
|
14537
|
+
* themselves have containers or projections.
|
|
14538
|
+
*
|
|
14539
|
+
* @param renderer Renderer to use
|
|
14540
|
+
* @param action action to perform (insert, detach, destroy)
|
|
14541
|
+
* @param lContainer The LContainer which needs to be inserted, detached, destroyed.
|
|
14542
|
+
* @param renderParent parent DOM element for insertion/removal.
|
|
14543
|
+
* @param beforeNode Before which node the insertions should happen.
|
|
14544
|
+
*/
|
|
14545
|
+
function executeActionOnContainer(renderer, action, lContainer, renderParent, beforeNode) {
|
|
14546
|
+
ngDevMode && assertLContainer(lContainer);
|
|
14547
|
+
var anchor = lContainer[NATIVE]; // LContainer has its own before node.
|
|
14548
|
+
var native = unwrapRNode(lContainer);
|
|
14549
|
+
// An LContainer can be created dynamically on any node by injecting ViewContainerRef.
|
|
14550
|
+
// Asking for a ViewContainerRef on an element will result in a creation of a separate anchor node
|
|
14551
|
+
// (comment in the DOM) that will be different from the LContainer's host node. In this particular
|
|
14552
|
+
// case we need to execute action on 2 nodes:
|
|
14553
|
+
// - container's host node (this is done in the executeNodeAction)
|
|
14554
|
+
// - container's host node (this is done here)
|
|
14555
|
+
if (anchor !== native) {
|
|
14556
|
+
executeActionOnElementOrContainer(action, renderer, renderParent, anchor, beforeNode);
|
|
14557
|
+
}
|
|
14558
|
+
for (var i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
|
|
14559
|
+
var lView = lContainer[i];
|
|
14560
|
+
executeActionOnView(renderer, action, lView, renderParent, anchor);
|
|
14561
|
+
}
|
|
14562
|
+
}
|
|
14563
|
+
/**
|
|
14564
|
+
* `executeActionOnElementContainer` performs an operation on the ng-container node and its child
|
|
14565
|
+
* nodes as specified by the `action` (insert, detach, destroy).
|
|
14566
|
+
*
|
|
14567
|
+
* @param renderer Renderer to use
|
|
14568
|
+
* @param action action to perform (insert, detach, destroy)
|
|
14569
|
+
* @param lView The LView which needs to be inserted, detached, destroyed.
|
|
14570
|
+
* @param tElementContainerNode The TNode associated with the ElementContainer.
|
|
14571
|
+
* @param renderParent parent DOM element for insertion/removal.
|
|
14572
|
+
* @param beforeNode Before which node the insertions should happen.
|
|
14573
|
+
*/
|
|
14574
|
+
function executeActionOnElementContainer(renderer, action, lView, tElementContainerNode, renderParent, beforeNode) {
|
|
14575
|
+
var node = lView[tElementContainerNode.index];
|
|
14576
|
+
executeActionOnElementOrContainer(action, renderer, renderParent, node, beforeNode);
|
|
14577
|
+
var childTNode = tElementContainerNode.child;
|
|
14578
|
+
while (childTNode) {
|
|
14579
|
+
executeActionOnNode(renderer, action, lView, childTNode, renderParent, beforeNode);
|
|
14580
|
+
childTNode = childTNode.next;
|
|
14581
|
+
}
|
|
14582
|
+
}
|
|
14583
|
+
function executeActionOnNode(renderer, action, lView, tNode, renderParent, beforeNode) {
|
|
14584
|
+
var elementContainerRootTNodeType = tNode.type;
|
|
14585
|
+
if (elementContainerRootTNodeType === 4 /* ElementContainer */) {
|
|
14586
|
+
executeActionOnElementContainer(renderer, action, lView, tNode, renderParent, beforeNode);
|
|
14587
|
+
}
|
|
14588
|
+
else if (elementContainerRootTNodeType === 1 /* Projection */) {
|
|
14589
|
+
executeActionOnProjection(renderer, action, lView, tNode, renderParent, beforeNode);
|
|
14590
|
+
}
|
|
14591
|
+
else {
|
|
14592
|
+
ngDevMode && assertNodeOfPossibleTypes(tNode, 3 /* Element */, 0 /* Container */);
|
|
14593
|
+
executeActionOnElementOrContainer(action, renderer, renderParent, lView[tNode.index], beforeNode);
|
|
14594
|
+
}
|
|
14595
|
+
}
|
|
14558
14596
|
|
|
14559
14597
|
/**
|
|
14560
14598
|
* @license
|
|
@@ -15778,7 +15816,10 @@
|
|
|
15778
15816
|
refreshDescendantViews(lView); // update mode pass
|
|
15779
15817
|
var lContainer = lView[PARENT];
|
|
15780
15818
|
ngDevMode && assertLContainerOrUndefined(lContainer);
|
|
15781
|
-
leaveView
|
|
15819
|
+
// It's always safe to run hooks here, as `leaveView` is not called during the 'finally' block
|
|
15820
|
+
// of a try-catch-finally statement, so it can never be reached while unwinding the stack due to
|
|
15821
|
+
// an error being thrown.
|
|
15822
|
+
leaveView(lContainer[PARENT], /* safeToRunHooks */ true);
|
|
15782
15823
|
setPreviousOrParentTNode(viewHost, false);
|
|
15783
15824
|
}
|
|
15784
15825
|
|
|
@@ -16631,6 +16672,7 @@
|
|
|
16631
16672
|
ngDevMode && ngDevMode.rendererCreateTextNode++;
|
|
16632
16673
|
ngDevMode && assertDataInRange(lView, index + HEADER_OFFSET);
|
|
16633
16674
|
var textNative = lView[index + HEADER_OFFSET] = createTextNode(value, lView[RENDERER]);
|
|
16675
|
+
ngDevMode && ngDevMode.rendererSetText++;
|
|
16634
16676
|
var tNode = getOrCreateTNode(lView[TVIEW], lView[T_HOST], index, 3 /* Element */, null, null);
|
|
16635
16677
|
// Text nodes are self closing.
|
|
16636
16678
|
setIsNotParent();
|
|
@@ -16640,21 +16682,16 @@
|
|
|
16640
16682
|
* Create text node with binding
|
|
16641
16683
|
* Bindings should be handled externally with the proper interpolation(1-8) method
|
|
16642
16684
|
*
|
|
16643
|
-
* @param index Index of the node in the data array.
|
|
16644
16685
|
* @param value Stringified value to write.
|
|
16645
16686
|
*
|
|
16646
16687
|
* @codeGenApi
|
|
16647
16688
|
*/
|
|
16648
|
-
function ɵɵtextBinding(
|
|
16649
|
-
|
|
16650
|
-
|
|
16651
|
-
|
|
16652
|
-
|
|
16653
|
-
|
|
16654
|
-
ngDevMode && ngDevMode.rendererSetText++;
|
|
16655
|
-
var renderer = lView[RENDERER];
|
|
16656
|
-
isProceduralRenderer(renderer) ? renderer.setValue(element, renderStringify(value)) :
|
|
16657
|
-
element.textContent = renderStringify(value);
|
|
16689
|
+
function ɵɵtextBinding(value) {
|
|
16690
|
+
var lView = getLView();
|
|
16691
|
+
var index = getSelectedIndex();
|
|
16692
|
+
var bound = bind(lView, value);
|
|
16693
|
+
if (bound !== NO_CHANGE) {
|
|
16694
|
+
textBindingInternal(lView, index, renderStringify(bound));
|
|
16658
16695
|
}
|
|
16659
16696
|
}
|
|
16660
16697
|
|
|
@@ -16710,7 +16747,11 @@
|
|
|
16710
16747
|
*/
|
|
16711
16748
|
function ɵɵtextInterpolate1(prefix, v0, suffix) {
|
|
16712
16749
|
var index = getSelectedIndex();
|
|
16713
|
-
|
|
16750
|
+
var lView = getLView();
|
|
16751
|
+
var interpolated = ɵɵinterpolation1(prefix, v0, suffix);
|
|
16752
|
+
if (interpolated !== NO_CHANGE) {
|
|
16753
|
+
textBindingInternal(lView, index, interpolated);
|
|
16754
|
+
}
|
|
16714
16755
|
return ɵɵtextInterpolate1;
|
|
16715
16756
|
}
|
|
16716
16757
|
/**
|
|
@@ -16734,7 +16775,11 @@
|
|
|
16734
16775
|
*/
|
|
16735
16776
|
function ɵɵtextInterpolate2(prefix, v0, i0, v1, suffix) {
|
|
16736
16777
|
var index = getSelectedIndex();
|
|
16737
|
-
|
|
16778
|
+
var lView = getLView();
|
|
16779
|
+
var interpolated = ɵɵinterpolation2(prefix, v0, i0, v1, suffix);
|
|
16780
|
+
if (interpolated !== NO_CHANGE) {
|
|
16781
|
+
textBindingInternal(lView, index, interpolated);
|
|
16782
|
+
}
|
|
16738
16783
|
return ɵɵtextInterpolate2;
|
|
16739
16784
|
}
|
|
16740
16785
|
/**
|
|
@@ -16759,7 +16804,11 @@
|
|
|
16759
16804
|
*/
|
|
16760
16805
|
function ɵɵtextInterpolate3(prefix, v0, i0, v1, i1, v2, suffix) {
|
|
16761
16806
|
var index = getSelectedIndex();
|
|
16762
|
-
|
|
16807
|
+
var lView = getLView();
|
|
16808
|
+
var interpolated = ɵɵinterpolation3(prefix, v0, i0, v1, i1, v2, suffix);
|
|
16809
|
+
if (interpolated !== NO_CHANGE) {
|
|
16810
|
+
textBindingInternal(lView, index, interpolated);
|
|
16811
|
+
}
|
|
16763
16812
|
return ɵɵtextInterpolate3;
|
|
16764
16813
|
}
|
|
16765
16814
|
/**
|
|
@@ -16784,7 +16833,11 @@
|
|
|
16784
16833
|
*/
|
|
16785
16834
|
function ɵɵtextInterpolate4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix) {
|
|
16786
16835
|
var index = getSelectedIndex();
|
|
16787
|
-
|
|
16836
|
+
var lView = getLView();
|
|
16837
|
+
var interpolated = ɵɵinterpolation4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
|
|
16838
|
+
if (interpolated !== NO_CHANGE) {
|
|
16839
|
+
textBindingInternal(lView, index, interpolated);
|
|
16840
|
+
}
|
|
16788
16841
|
return ɵɵtextInterpolate4;
|
|
16789
16842
|
}
|
|
16790
16843
|
/**
|
|
@@ -16809,7 +16862,11 @@
|
|
|
16809
16862
|
*/
|
|
16810
16863
|
function ɵɵtextInterpolate5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix) {
|
|
16811
16864
|
var index = getSelectedIndex();
|
|
16812
|
-
|
|
16865
|
+
var lView = getLView();
|
|
16866
|
+
var interpolated = ɵɵinterpolation5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
|
|
16867
|
+
if (interpolated !== NO_CHANGE) {
|
|
16868
|
+
textBindingInternal(lView, index, interpolated);
|
|
16869
|
+
}
|
|
16813
16870
|
return ɵɵtextInterpolate5;
|
|
16814
16871
|
}
|
|
16815
16872
|
/**
|
|
@@ -16836,7 +16893,11 @@
|
|
|
16836
16893
|
*/
|
|
16837
16894
|
function ɵɵtextInterpolate6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix) {
|
|
16838
16895
|
var index = getSelectedIndex();
|
|
16839
|
-
|
|
16896
|
+
var lView = getLView();
|
|
16897
|
+
var interpolated = ɵɵinterpolation6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
|
|
16898
|
+
if (interpolated !== NO_CHANGE) {
|
|
16899
|
+
textBindingInternal(lView, index, interpolated);
|
|
16900
|
+
}
|
|
16840
16901
|
return ɵɵtextInterpolate6;
|
|
16841
16902
|
}
|
|
16842
16903
|
/**
|
|
@@ -16861,7 +16922,11 @@
|
|
|
16861
16922
|
*/
|
|
16862
16923
|
function ɵɵtextInterpolate7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix) {
|
|
16863
16924
|
var index = getSelectedIndex();
|
|
16864
|
-
|
|
16925
|
+
var lView = getLView();
|
|
16926
|
+
var interpolated = ɵɵinterpolation7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
|
|
16927
|
+
if (interpolated !== NO_CHANGE) {
|
|
16928
|
+
textBindingInternal(lView, index, interpolated);
|
|
16929
|
+
}
|
|
16865
16930
|
return ɵɵtextInterpolate7;
|
|
16866
16931
|
}
|
|
16867
16932
|
/**
|
|
@@ -16886,7 +16951,11 @@
|
|
|
16886
16951
|
*/
|
|
16887
16952
|
function ɵɵtextInterpolate8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix) {
|
|
16888
16953
|
var index = getSelectedIndex();
|
|
16889
|
-
|
|
16954
|
+
var lView = getLView();
|
|
16955
|
+
var interpolated = ɵɵinterpolation8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
|
|
16956
|
+
if (interpolated !== NO_CHANGE) {
|
|
16957
|
+
textBindingInternal(lView, index, interpolated);
|
|
16958
|
+
}
|
|
16890
16959
|
return ɵɵtextInterpolate8;
|
|
16891
16960
|
}
|
|
16892
16961
|
/**
|
|
@@ -16915,7 +16984,11 @@
|
|
|
16915
16984
|
*/
|
|
16916
16985
|
function ɵɵtextInterpolateV(values) {
|
|
16917
16986
|
var index = getSelectedIndex();
|
|
16918
|
-
|
|
16987
|
+
var lView = getLView();
|
|
16988
|
+
var interpolated = ɵɵinterpolationV(values);
|
|
16989
|
+
if (interpolated !== NO_CHANGE) {
|
|
16990
|
+
textBindingInternal(lView, index, interpolated);
|
|
16991
|
+
}
|
|
16919
16992
|
return ɵɵtextInterpolateV;
|
|
16920
16993
|
}
|
|
16921
16994
|
|
|
@@ -17361,6 +17434,8 @@
|
|
|
17361
17434
|
var rootView = createLView(null, createTView(-1, null, 1, 0, null, null, null, null), rootContext, rootFlags, null, null, rendererFactory, renderer, undefined, opts.injector || null);
|
|
17362
17435
|
var oldView = enterView(rootView, null);
|
|
17363
17436
|
var component;
|
|
17437
|
+
// Will become true if the `try` block executes with no errors.
|
|
17438
|
+
var safeToRunHooks = false;
|
|
17364
17439
|
try {
|
|
17365
17440
|
if (rendererFactory.begin)
|
|
17366
17441
|
rendererFactory.begin();
|
|
@@ -17371,9 +17446,10 @@
|
|
|
17371
17446
|
rootView[FLAGS] &= ~4 /* CreationMode */;
|
|
17372
17447
|
resetPreOrderHookFlags(rootView);
|
|
17373
17448
|
refreshDescendantViews(rootView); // update mode pass
|
|
17449
|
+
safeToRunHooks = true;
|
|
17374
17450
|
}
|
|
17375
17451
|
finally {
|
|
17376
|
-
leaveView(oldView);
|
|
17452
|
+
leaveView(oldView, safeToRunHooks);
|
|
17377
17453
|
if (rendererFactory.end)
|
|
17378
17454
|
rendererFactory.end();
|
|
17379
17455
|
}
|
|
@@ -18002,6 +18078,7 @@
|
|
|
18002
18078
|
* and publish them into the DI system, making it visible to others for injection.
|
|
18003
18079
|
*
|
|
18004
18080
|
* For example:
|
|
18081
|
+
* ```ts
|
|
18005
18082
|
* class ComponentWithProviders {
|
|
18006
18083
|
* constructor(private greeter: GreeterDE) {}
|
|
18007
18084
|
*
|
|
@@ -18013,15 +18090,17 @@
|
|
|
18013
18090
|
* vars: 1,
|
|
18014
18091
|
* template: function(fs: RenderFlags, ctx: ComponentWithProviders) {
|
|
18015
18092
|
* if (fs & RenderFlags.Create) {
|
|
18016
|
-
*
|
|
18093
|
+
* ɵɵtext(0);
|
|
18017
18094
|
* }
|
|
18018
18095
|
* if (fs & RenderFlags.Update) {
|
|
18019
|
-
*
|
|
18096
|
+
* ɵɵselect(0);
|
|
18097
|
+
* ɵɵtextBinding(ctx.greeter.greet());
|
|
18020
18098
|
* }
|
|
18021
18099
|
* },
|
|
18022
18100
|
* features: [ProvidersFeature([GreeterDE])]
|
|
18023
18101
|
* });
|
|
18024
18102
|
* }
|
|
18103
|
+
* ```
|
|
18025
18104
|
*
|
|
18026
18105
|
* @param definition
|
|
18027
18106
|
*
|
|
@@ -18059,6 +18138,12 @@
|
|
|
18059
18138
|
return ComponentRef;
|
|
18060
18139
|
}());
|
|
18061
18140
|
/**
|
|
18141
|
+
* Base class for a factory that can create a component dynamically.
|
|
18142
|
+
* Instantiate a factory for a given type of component with `resolveComponentFactory()`.
|
|
18143
|
+
* Use the resulting `ComponentFactory.create()` method to create a component of that type.
|
|
18144
|
+
*
|
|
18145
|
+
* @see [Dynamic Components](guide/dynamic-component-loader)
|
|
18146
|
+
*
|
|
18062
18147
|
* @publicApi
|
|
18063
18148
|
*/
|
|
18064
18149
|
var ComponentFactory = /** @class */ (function () {
|
|
@@ -18089,6 +18174,12 @@
|
|
|
18089
18174
|
return _NullComponentFactoryResolver;
|
|
18090
18175
|
}());
|
|
18091
18176
|
/**
|
|
18177
|
+
* A simple registry that maps `Components` to generated `ComponentFactory` classes
|
|
18178
|
+
* that can be used to create instances of components.
|
|
18179
|
+
* Use to obtain the factory for a given component type,
|
|
18180
|
+
* then use the factory's `create()` method to create a component of that type.
|
|
18181
|
+
*
|
|
18182
|
+
* @see [Dynamic Components](guide/dynamic-component-loader)
|
|
18092
18183
|
* @publicApi
|
|
18093
18184
|
*/
|
|
18094
18185
|
var ComponentFactoryResolver = /** @class */ (function () {
|
|
@@ -18586,7 +18677,6 @@
|
|
|
18586
18677
|
_this._lContainer = _lContainer;
|
|
18587
18678
|
_this._hostTNode = _hostTNode;
|
|
18588
18679
|
_this._hostView = _hostView;
|
|
18589
|
-
_this._viewRefs = [];
|
|
18590
18680
|
return _this;
|
|
18591
18681
|
}
|
|
18592
18682
|
Object.defineProperty(ViewContainerRef_.prototype, "element", {
|
|
@@ -18619,7 +18709,9 @@
|
|
|
18619
18709
|
this.remove(0);
|
|
18620
18710
|
}
|
|
18621
18711
|
};
|
|
18622
|
-
ViewContainerRef_.prototype.get = function (index) {
|
|
18712
|
+
ViewContainerRef_.prototype.get = function (index) {
|
|
18713
|
+
return this._lContainer[VIEW_REFS] !== null && this._lContainer[VIEW_REFS][index] || null;
|
|
18714
|
+
};
|
|
18623
18715
|
Object.defineProperty(ViewContainerRef_.prototype, "length", {
|
|
18624
18716
|
get: function () {
|
|
18625
18717
|
// Note that if there are no views, the container
|
|
@@ -18631,11 +18723,12 @@
|
|
|
18631
18723
|
configurable: true
|
|
18632
18724
|
});
|
|
18633
18725
|
ViewContainerRef_.prototype.createEmbeddedView = function (templateRef, context, index) {
|
|
18726
|
+
this.allocateContainerIfNeeded();
|
|
18634
18727
|
var adjustedIdx = this._adjustIndex(index);
|
|
18635
18728
|
var viewRef = templateRef
|
|
18636
18729
|
.createEmbeddedView(context || {}, this._lContainer, adjustedIdx);
|
|
18637
18730
|
viewRef.attachToViewContainerRef(this);
|
|
18638
|
-
this.
|
|
18731
|
+
this._lContainer[VIEW_REFS].splice(adjustedIdx, 0, viewRef);
|
|
18639
18732
|
return viewRef;
|
|
18640
18733
|
};
|
|
18641
18734
|
ViewContainerRef_.prototype.createComponent = function (componentFactory, index, injector, projectableNodes, ngModuleRef) {
|
|
@@ -18651,6 +18744,7 @@
|
|
|
18651
18744
|
if (viewRef.destroyed) {
|
|
18652
18745
|
throw new Error('Cannot insert a destroyed View in a ViewContainer!');
|
|
18653
18746
|
}
|
|
18747
|
+
this.allocateContainerIfNeeded();
|
|
18654
18748
|
var lView = viewRef._lView;
|
|
18655
18749
|
var adjustedIdx = this._adjustIndex(index);
|
|
18656
18750
|
if (viewAttachedToContainer(lView)) {
|
|
@@ -18662,7 +18756,7 @@
|
|
|
18662
18756
|
var beforeNode = getBeforeNodeForView(adjustedIdx, this._lContainer);
|
|
18663
18757
|
addRemoveViewFromContainer(lView, true, beforeNode);
|
|
18664
18758
|
viewRef.attachToViewContainerRef(this);
|
|
18665
|
-
this.
|
|
18759
|
+
this._lContainer[VIEW_REFS].splice(adjustedIdx, 0, viewRef);
|
|
18666
18760
|
return viewRef;
|
|
18667
18761
|
};
|
|
18668
18762
|
ViewContainerRef_.prototype.move = function (viewRef, newIndex) {
|
|
@@ -18675,16 +18769,22 @@
|
|
|
18675
18769
|
this.insert(viewRef, newIndex);
|
|
18676
18770
|
return viewRef;
|
|
18677
18771
|
};
|
|
18678
|
-
ViewContainerRef_.prototype.indexOf = function (viewRef) {
|
|
18772
|
+
ViewContainerRef_.prototype.indexOf = function (viewRef) {
|
|
18773
|
+
return this._lContainer[VIEW_REFS] !== null ?
|
|
18774
|
+
this._lContainer[VIEW_REFS].indexOf(viewRef) :
|
|
18775
|
+
0;
|
|
18776
|
+
};
|
|
18679
18777
|
ViewContainerRef_.prototype.remove = function (index) {
|
|
18778
|
+
this.allocateContainerIfNeeded();
|
|
18680
18779
|
var adjustedIdx = this._adjustIndex(index, -1);
|
|
18681
18780
|
removeView(this._lContainer, adjustedIdx);
|
|
18682
|
-
this.
|
|
18781
|
+
this._lContainer[VIEW_REFS].splice(adjustedIdx, 1);
|
|
18683
18782
|
};
|
|
18684
18783
|
ViewContainerRef_.prototype.detach = function (index) {
|
|
18784
|
+
this.allocateContainerIfNeeded();
|
|
18685
18785
|
var adjustedIdx = this._adjustIndex(index, -1);
|
|
18686
18786
|
var view = detachView(this._lContainer, adjustedIdx);
|
|
18687
|
-
var wasDetached = view && this.
|
|
18787
|
+
var wasDetached = view && this._lContainer[VIEW_REFS].splice(adjustedIdx, 1)[0] != null;
|
|
18688
18788
|
return wasDetached ? new ViewRef(view, view[CONTEXT], -1) : null;
|
|
18689
18789
|
};
|
|
18690
18790
|
ViewContainerRef_.prototype._adjustIndex = function (index, shift) {
|
|
@@ -18699,6 +18799,11 @@
|
|
|
18699
18799
|
}
|
|
18700
18800
|
return index;
|
|
18701
18801
|
};
|
|
18802
|
+
ViewContainerRef_.prototype.allocateContainerIfNeeded = function () {
|
|
18803
|
+
if (this._lContainer[VIEW_REFS] === null) {
|
|
18804
|
+
this._lContainer[VIEW_REFS] = [];
|
|
18805
|
+
}
|
|
18806
|
+
};
|
|
18702
18807
|
return ViewContainerRef_;
|
|
18703
18808
|
}(ViewContainerRefToken));
|
|
18704
18809
|
}
|
|
@@ -18765,6 +18870,7 @@
|
|
|
18765
18870
|
}
|
|
18766
18871
|
return null;
|
|
18767
18872
|
}
|
|
18873
|
+
/** Returns a Renderer2 (or throws when application was bootstrapped with Renderer3) */
|
|
18768
18874
|
function getOrCreateRenderer2(view) {
|
|
18769
18875
|
var renderer = view[RENDERER];
|
|
18770
18876
|
if (isProceduralRenderer(renderer)) {
|
|
@@ -18774,9 +18880,14 @@
|
|
|
18774
18880
|
throw new Error('Cannot inject Renderer2 when the application uses Renderer3!');
|
|
18775
18881
|
}
|
|
18776
18882
|
}
|
|
18777
|
-
/**
|
|
18883
|
+
/** Injects a Renderer2 for the current component. */
|
|
18778
18884
|
function injectRenderer2() {
|
|
18779
|
-
|
|
18885
|
+
// We need the Renderer to be based on the component that it's being injected into, however since
|
|
18886
|
+
// DI happens before we've entered its view, `getLView` will return the parent view instead.
|
|
18887
|
+
var lView = getLView();
|
|
18888
|
+
var tNode = getPreviousOrParentTNode();
|
|
18889
|
+
var nodeAtIndex = getComponentViewByIndex(tNode.index, lView);
|
|
18890
|
+
return getOrCreateRenderer2(isLView(nodeAtIndex) ? nodeAtIndex : lView);
|
|
18780
18891
|
}
|
|
18781
18892
|
|
|
18782
18893
|
/**
|
|
@@ -18964,7 +19075,7 @@
|
|
|
18964
19075
|
/**
|
|
18965
19076
|
* @publicApi
|
|
18966
19077
|
*/
|
|
18967
|
-
var VERSION = new Version('8.1.
|
|
19078
|
+
var VERSION = new Version('8.1.1');
|
|
18968
19079
|
|
|
18969
19080
|
/**
|
|
18970
19081
|
* @license
|
|
@@ -22164,6 +22275,8 @@
|
|
|
22164
22275
|
var oldLView = enterView(rootLView, null);
|
|
22165
22276
|
var component;
|
|
22166
22277
|
var tElementNode;
|
|
22278
|
+
// Will become true if the `try` block executes with no errors.
|
|
22279
|
+
var safeToRunHooks = false;
|
|
22167
22280
|
try {
|
|
22168
22281
|
var componentView = createRootComponentView(hostRNode, this.componentDef, rootLView, rendererFactory, renderer);
|
|
22169
22282
|
tElementNode = getTNode(0, rootLView);
|
|
@@ -22180,9 +22293,10 @@
|
|
|
22180
22293
|
component = createRootComponent(componentView, this.componentDef, rootLView, rootContext, [LifecycleHooksFeature]);
|
|
22181
22294
|
addToViewTree(rootLView, componentView);
|
|
22182
22295
|
refreshDescendantViews(rootLView);
|
|
22296
|
+
safeToRunHooks = true;
|
|
22183
22297
|
}
|
|
22184
22298
|
finally {
|
|
22185
|
-
leaveView(oldLView);
|
|
22299
|
+
leaveView(oldLView, safeToRunHooks);
|
|
22186
22300
|
}
|
|
22187
22301
|
var componentRef = new ComponentRef$1(this.componentType, component, createElementRef(ElementRef, tElementNode, rootLView), rootLView, tElementNode);
|
|
22188
22302
|
if (isInternalRootView) {
|
|
@@ -22222,14 +22336,16 @@
|
|
|
22222
22336
|
configurable: true
|
|
22223
22337
|
});
|
|
22224
22338
|
ComponentRef.prototype.destroy = function () {
|
|
22225
|
-
|
|
22226
|
-
|
|
22227
|
-
|
|
22228
|
-
|
|
22339
|
+
if (this.destroyCbs) {
|
|
22340
|
+
this.destroyCbs.forEach(function (fn) { return fn(); });
|
|
22341
|
+
this.destroyCbs = null;
|
|
22342
|
+
!this.hostView.destroyed && this.hostView.destroy();
|
|
22343
|
+
}
|
|
22229
22344
|
};
|
|
22230
22345
|
ComponentRef.prototype.onDestroy = function (callback) {
|
|
22231
|
-
|
|
22232
|
-
|
|
22346
|
+
if (this.destroyCbs) {
|
|
22347
|
+
this.destroyCbs.push(callback);
|
|
22348
|
+
}
|
|
22233
22349
|
};
|
|
22234
22350
|
return ComponentRef;
|
|
22235
22351
|
}(ComponentRef));
|
|
@@ -23133,7 +23249,7 @@
|
|
|
23133
23249
|
elementPropertyInternal(nodeIndex, propName, value, sanitizeFn);
|
|
23134
23250
|
break;
|
|
23135
23251
|
case 0 /* Text */:
|
|
23136
|
-
|
|
23252
|
+
textBindingInternal(viewData, nodeIndex, value);
|
|
23137
23253
|
break;
|
|
23138
23254
|
case 2 /* IcuSwitch */:
|
|
23139
23255
|
tIcuIndex = updateOpCodes[++j];
|
|
@@ -23292,15 +23408,20 @@
|
|
|
23292
23408
|
* Stores the values of the bindings during each update cycle in order to determine if we need to
|
|
23293
23409
|
* update the translated nodes.
|
|
23294
23410
|
*
|
|
23295
|
-
* @param
|
|
23411
|
+
* @param value The binding's value
|
|
23412
|
+
* @returns This function returns itself so that it may be chained
|
|
23413
|
+
* (e.g. `i18nExp(ctx.name)(ctx.title)`)
|
|
23296
23414
|
*
|
|
23297
23415
|
* @codeGenApi
|
|
23298
23416
|
*/
|
|
23299
|
-
function ɵɵi18nExp(
|
|
23417
|
+
function ɵɵi18nExp(value) {
|
|
23418
|
+
var lView = getLView();
|
|
23419
|
+
var expression = bind(lView, value);
|
|
23300
23420
|
if (expression !== NO_CHANGE) {
|
|
23301
23421
|
changeMask = changeMask | (1 << shiftsCounter);
|
|
23302
23422
|
}
|
|
23303
23423
|
shiftsCounter++;
|
|
23424
|
+
return ɵɵi18nExp;
|
|
23304
23425
|
}
|
|
23305
23426
|
/**
|
|
23306
23427
|
* Updates a translation block or an i18n attribute when the bindings have changed.
|
|
@@ -23559,13 +23680,13 @@
|
|
|
23559
23680
|
* @deprecated this method is temporary & should not be used as it will be removed soon
|
|
23560
23681
|
*/
|
|
23561
23682
|
function ɵɵi18nLocalize(input, placeholders) {
|
|
23562
|
-
if (placeholders === void 0) { placeholders = {}; }
|
|
23563
23683
|
if (typeof TRANSLATIONS[input] !== 'undefined') { // to account for empty string
|
|
23564
23684
|
input = TRANSLATIONS[input];
|
|
23565
23685
|
}
|
|
23566
|
-
|
|
23567
|
-
input.replace(LOCALIZE_PH_REGEXP, function (
|
|
23568
|
-
|
|
23686
|
+
if (placeholders !== undefined && Object.keys(placeholders).length) {
|
|
23687
|
+
return input.replace(LOCALIZE_PH_REGEXP, function (_, key) { return placeholders[key] || ''; });
|
|
23688
|
+
}
|
|
23689
|
+
return input;
|
|
23569
23690
|
}
|
|
23570
23691
|
/**
|
|
23571
23692
|
* The locale id that the application is currently using (for translations and ICU expressions).
|
|
@@ -24260,7 +24381,7 @@
|
|
|
24260
24381
|
* that create event emitters. When the title is clicked, the emitter
|
|
24261
24382
|
* emits an open or close event to toggle the current visibility state.
|
|
24262
24383
|
*
|
|
24263
|
-
* ```
|
|
24384
|
+
* ```html
|
|
24264
24385
|
* @Component({
|
|
24265
24386
|
* selector: 'zippy',
|
|
24266
24387
|
* template: `
|
|
@@ -24289,17 +24410,10 @@
|
|
|
24289
24410
|
* Access the event object with the `$event` argument passed to the output event
|
|
24290
24411
|
* handler:
|
|
24291
24412
|
*
|
|
24292
|
-
* ```
|
|
24413
|
+
* ```html
|
|
24293
24414
|
* <zippy (open)="onOpen($event)" (close)="onClose($event)"></zippy>
|
|
24294
24415
|
* ```
|
|
24295
24416
|
*
|
|
24296
|
-
* ### Notes
|
|
24297
|
-
*
|
|
24298
|
-
* Uses Rx.Observable but provides an adapter to make it work as specified here:
|
|
24299
|
-
* https://github.com/jhusain/observable-spec
|
|
24300
|
-
*
|
|
24301
|
-
* Once a reference implementation of the spec is available, switch to it.
|
|
24302
|
-
*
|
|
24303
24417
|
* @publicApi
|
|
24304
24418
|
*/
|
|
24305
24419
|
var EventEmitter = /** @class */ (function (_super) {
|
|
@@ -24673,9 +24787,10 @@
|
|
|
24673
24787
|
return factoryFn();
|
|
24674
24788
|
}
|
|
24675
24789
|
else {
|
|
24676
|
-
var
|
|
24790
|
+
var tView = currentView[TVIEW];
|
|
24791
|
+
var matchingIdx = locateDirectiveOrProvider(tNode, tView, read, false, false);
|
|
24677
24792
|
if (matchingIdx !== null) {
|
|
24678
|
-
return getNodeInjectable(
|
|
24793
|
+
return getNodeInjectable(tView.data, currentView, matchingIdx, tNode);
|
|
24679
24794
|
}
|
|
24680
24795
|
}
|
|
24681
24796
|
return null;
|
|
@@ -24717,19 +24832,20 @@
|
|
|
24717
24832
|
* out of order (e.g. a view was created in a constructor)
|
|
24718
24833
|
*/
|
|
24719
24834
|
function add(query, tNode, insertBeforeContainer) {
|
|
24720
|
-
var
|
|
24835
|
+
var lView = getLView();
|
|
24836
|
+
var tView = lView[TVIEW];
|
|
24721
24837
|
while (query) {
|
|
24722
24838
|
var predicate = query.predicate;
|
|
24723
24839
|
var type = predicate.type;
|
|
24724
24840
|
if (type) {
|
|
24725
24841
|
var result = null;
|
|
24726
24842
|
if (type === TemplateRef) {
|
|
24727
|
-
result = queryByTemplateRef(type, tNode,
|
|
24843
|
+
result = queryByTemplateRef(type, tNode, lView, predicate.read);
|
|
24728
24844
|
}
|
|
24729
24845
|
else {
|
|
24730
|
-
var matchingIdx = locateDirectiveOrProvider(tNode,
|
|
24846
|
+
var matchingIdx = locateDirectiveOrProvider(tNode, tView, type, false, false);
|
|
24731
24847
|
if (matchingIdx !== null) {
|
|
24732
|
-
result = queryRead(tNode,
|
|
24848
|
+
result = queryRead(tNode, lView, predicate.read, matchingIdx);
|
|
24733
24849
|
}
|
|
24734
24850
|
}
|
|
24735
24851
|
if (result !== null) {
|
|
@@ -24741,7 +24857,7 @@
|
|
|
24741
24857
|
for (var i = 0; i < selector.length; i++) {
|
|
24742
24858
|
var matchingIdx = getIdxOfMatchingSelector(tNode, selector[i]);
|
|
24743
24859
|
if (matchingIdx !== null) {
|
|
24744
|
-
var result = queryRead(tNode,
|
|
24860
|
+
var result = queryRead(tNode, lView, predicate.read, matchingIdx);
|
|
24745
24861
|
if (result !== null) {
|
|
24746
24862
|
addMatch(query, result, insertBeforeContainer);
|
|
24747
24863
|
}
|
|
@@ -24991,7 +25107,6 @@
|
|
|
24991
25107
|
'ɵɵNgOnChangesFeature': ɵɵNgOnChangesFeature,
|
|
24992
25108
|
'ɵɵProvidersFeature': ɵɵProvidersFeature,
|
|
24993
25109
|
'ɵɵInheritDefinitionFeature': ɵɵInheritDefinitionFeature,
|
|
24994
|
-
'ɵɵbind': ɵɵbind,
|
|
24995
25110
|
'ɵɵcontainer': ɵɵcontainer,
|
|
24996
25111
|
'ɵɵnextContext': ɵɵnextContext,
|
|
24997
25112
|
'ɵɵcontainerRefreshStart': ɵɵcontainerRefreshStart,
|
|
@@ -25862,9 +25977,10 @@
|
|
|
25862
25977
|
var HostBinding = makePropDecorator('HostBinding', ɵ8);
|
|
25863
25978
|
var ɵ9 = function (eventName, args) { return ({ eventName: eventName, args: args }); };
|
|
25864
25979
|
/**
|
|
25865
|
-
*
|
|
25980
|
+
* Decorator that binds a DOM event to a host listener and supplies configuration metadata.
|
|
25866
25981
|
* Angular invokes the supplied handler method when the host element emits the specified event,
|
|
25867
25982
|
* and updates the bound element with the result.
|
|
25983
|
+
*
|
|
25868
25984
|
* If the handler method returns false, applies `preventDefault` on the bound element.
|
|
25869
25985
|
*
|
|
25870
25986
|
* @usageNotes
|
|
@@ -25872,7 +25988,7 @@
|
|
|
25872
25988
|
* The following example declares a directive
|
|
25873
25989
|
* that attaches a click listener to a button and counts clicks.
|
|
25874
25990
|
*
|
|
25875
|
-
* ```
|
|
25991
|
+
* ```ts
|
|
25876
25992
|
* @Directive({selector: 'button[counting]'})
|
|
25877
25993
|
* class CountClicks {
|
|
25878
25994
|
* numberOfClicks = 0;
|
|
@@ -31250,7 +31366,6 @@
|
|
|
31250
31366
|
exports.ɵɵtextInterpolateV = ɵɵtextInterpolateV;
|
|
31251
31367
|
exports.ɵɵembeddedViewStart = ɵɵembeddedViewStart;
|
|
31252
31368
|
exports.ɵɵprojection = ɵɵprojection;
|
|
31253
|
-
exports.ɵɵbind = ɵɵbind;
|
|
31254
31369
|
exports.ɵɵinterpolation1 = ɵɵinterpolation1;
|
|
31255
31370
|
exports.ɵɵinterpolation2 = ɵɵinterpolation2;
|
|
31256
31371
|
exports.ɵɵinterpolation3 = ɵɵinterpolation3;
|