@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.
Files changed (104) hide show
  1. package/bundles/core-testing.umd.js +1 -1
  2. package/bundles/core-testing.umd.js.map +1 -1
  3. package/bundles/core-testing.umd.min.js +1 -1
  4. package/bundles/core-testing.umd.min.js.map +1 -1
  5. package/bundles/core.umd.js +394 -279
  6. package/bundles/core.umd.js.map +1 -1
  7. package/bundles/core.umd.min.js +101 -101
  8. package/bundles/core.umd.min.js.map +1 -1
  9. package/core.d.ts +221 -234
  10. package/core.metadata.json +1 -1
  11. package/esm2015/index.js +2 -2
  12. package/esm2015/public_api.js +2 -2
  13. package/esm2015/src/change_detection/pipe_transform.js +4 -6
  14. package/esm2015/src/core.js +2 -2
  15. package/esm2015/src/core_render3_private_export.js +2 -2
  16. package/esm2015/src/di/index.js +1 -1
  17. package/esm2015/src/di/injectable.js +1 -1
  18. package/esm2015/src/di/interface/provider.js +1 -1
  19. package/esm2015/src/di/metadata.js +1 -1
  20. package/esm2015/src/event_emitter.js +3 -10
  21. package/esm2015/src/linker/component_factory.js +9 -3
  22. package/esm2015/src/linker/component_factory_resolver.js +9 -2
  23. package/esm2015/src/metadata/di.js +1 -1
  24. package/esm2015/src/metadata/directives.js +4 -3
  25. package/esm2015/src/reflection/reflection_capabilities.js +2 -2
  26. package/esm2015/src/render3/component.js +6 -2
  27. package/esm2015/src/render3/component_ref.js +18 -13
  28. package/esm2015/src/render3/di.js +4 -6
  29. package/esm2015/src/render3/features/providers_feature.js +6 -3
  30. package/esm2015/src/render3/i18n.js +20 -13
  31. package/esm2015/src/render3/index.js +2 -2
  32. package/esm2015/src/render3/instructions/all.js +2 -2
  33. package/esm2015/src/render3/instructions/attribute.js +5 -4
  34. package/esm2015/src/render3/instructions/embedded_view.js +5 -2
  35. package/esm2015/src/render3/instructions/property.js +9 -8
  36. package/esm2015/src/render3/instructions/shared.js +36 -5
  37. package/esm2015/src/render3/instructions/text.js +15 -20
  38. package/esm2015/src/render3/instructions/text_interpolation.js +67 -12
  39. package/esm2015/src/render3/interfaces/container.js +6 -2
  40. package/esm2015/src/render3/interfaces/i18n.js +1 -17
  41. package/esm2015/src/render3/interfaces/node.js +2 -2
  42. package/esm2015/src/render3/interfaces/view.js +2 -2
  43. package/esm2015/src/render3/jit/environment.js +1 -2
  44. package/esm2015/src/render3/node_manipulation.js +235 -197
  45. package/esm2015/src/render3/query.js +12 -8
  46. package/esm2015/src/render3/state.js +6 -3
  47. package/esm2015/src/render3/util/misc_utils.js +1 -1
  48. package/esm2015/src/render3/util/view_traversal_utils.js +7 -2
  49. package/esm2015/src/render3/view_engine_compatibility.js +39 -12
  50. package/esm2015/src/util/assert.js +3 -2
  51. package/esm2015/src/util/decorators.js +1 -1
  52. package/esm2015/src/version.js +1 -1
  53. package/esm2015/testing/src/test_bed_common.js +5 -2
  54. package/esm5/src/change_detection/pipe_transform.js +1 -1
  55. package/esm5/src/core_render3_private_export.js +2 -2
  56. package/esm5/src/di/index.js +1 -1
  57. package/esm5/src/di/injectable.js +1 -1
  58. package/esm5/src/di/interface/provider.js +1 -1
  59. package/esm5/src/di/metadata.js +1 -1
  60. package/esm5/src/event_emitter.js +3 -10
  61. package/esm5/src/linker/component_factory.js +7 -1
  62. package/esm5/src/linker/component_factory_resolver.js +7 -1
  63. package/esm5/src/metadata/di.js +1 -1
  64. package/esm5/src/metadata/directives.js +4 -3
  65. package/esm5/src/reflection/reflection_capabilities.js +2 -2
  66. package/esm5/src/render3/component.js +5 -2
  67. package/esm5/src/render3/component_ref.js +13 -9
  68. package/esm5/src/render3/di.js +4 -5
  69. package/esm5/src/render3/features/providers_feature.js +6 -3
  70. package/esm5/src/render3/i18n.js +15 -10
  71. package/esm5/src/render3/index.js +2 -2
  72. package/esm5/src/render3/instructions/attribute.js +5 -4
  73. package/esm5/src/render3/instructions/embedded_view.js +5 -2
  74. package/esm5/src/render3/instructions/property.js +7 -7
  75. package/esm5/src/render3/instructions/shared.js +27 -5
  76. package/esm5/src/render3/instructions/text.js +12 -17
  77. package/esm5/src/render3/instructions/text_interpolation.js +49 -12
  78. package/esm5/src/render3/interfaces/container.js +3 -2
  79. package/esm5/src/render3/interfaces/i18n.js +1 -1
  80. package/esm5/src/render3/interfaces/node.js +1 -1
  81. package/esm5/src/render3/interfaces/view.js +1 -1
  82. package/esm5/src/render3/jit/environment.js +1 -2
  83. package/esm5/src/render3/node_manipulation.js +200 -192
  84. package/esm5/src/render3/query.js +10 -8
  85. package/esm5/src/render3/state.js +6 -3
  86. package/esm5/src/render3/util/misc_utils.js +1 -1
  87. package/esm5/src/render3/util/view_traversal_utils.js +7 -2
  88. package/esm5/src/render3/view_engine_compatibility.js +32 -12
  89. package/esm5/src/util/assert.js +3 -2
  90. package/esm5/src/util/decorators.js +1 -1
  91. package/esm5/src/version.js +1 -1
  92. package/esm5/testing/src/test_bed_common.js +1 -1
  93. package/fesm2015/core.js +483 -296
  94. package/fesm2015/core.js.map +1 -1
  95. package/fesm2015/testing.js +1 -1
  96. package/fesm2015/testing.js.map +1 -1
  97. package/fesm5/core.js +395 -279
  98. package/fesm5/core.js.map +1 -1
  99. package/fesm5/testing.js +1 -1
  100. package/fesm5/testing.js.map +1 -1
  101. package/package.json +1 -1
  102. package/src/r3_symbols.d.ts +73 -90
  103. package/testing/testing.d.ts +5 -2
  104. package/testing.d.ts +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v8.1.0-next.2
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, 'The provided value must be an instance of a DOM Node');
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 = 8;
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 a current view, finds the nearest component's host (LElement).
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, lView, token, canAccessViewProviders, isHostSpecialCase);
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 lView The view we are currently processing
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, lView, token, canAccessViewProviders, isHostSpecialCase) {
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 bindReconciledValue = ɵɵbind(value);
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 ɵɵbind(value) {
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 = ɵɵbind(value);
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 = ɵɵbind(value);
13156
+ var bound = bind(lView, value);
13127
13157
  if (bound !== NO_CHANGE) {
13128
- return elementAttributeInternal(index, name, bound, lView, sanitizer, namespace);
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 executeNodeAction(action, renderer, parent, node, tNode, beforeNode) {
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, node, beforeNode || null);
13868
+ nativeInsertBefore(renderer, parent, rNode, beforeNode || null);
13983
13869
  }
13984
13870
  else if (action === 1 /* Detach */) {
13985
- nativeRemoveNode(renderer, node, isComponent(tNode));
13871
+ nativeRemoveNode(renderer, rNode, isComponent);
13986
13872
  }
13987
13873
  else if (action === 2 /* Destroy */) {
13988
13874
  ngDevMode && ngDevMode.rendererDestroyNode++;
13989
- renderer.destroyNode(node);
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(viewToWalk, insertMode, beforeNode) {
13997
- var renderParent = getContainerRenderParent(viewToWalk[TVIEW].node, viewToWalk);
13998
- ngDevMode && assertNodeType(viewToWalk[TVIEW].node, 2 /* View */);
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 = viewToWalk[RENDERER];
14001
- walkTNodeTree(viewToWalk, insertMode ? 0 /* Insert */ : 1 /* Detach */, renderer, renderParent, beforeNode);
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
- walkTNodeTree(lView, 1 /* Detach */, lView[RENDERER], null);
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 view The view to be destroyed.
14030
+ * @param lView The view to be destroyed.
14141
14031
  */
14142
- function destroyLView(view) {
14143
- if (!(view[FLAGS] & 256 /* Destroyed */)) {
14144
- var renderer = view[RENDERER];
14032
+ function destroyLView(lView) {
14033
+ if (!(lView[FLAGS] & 256 /* Destroyed */)) {
14034
+ var renderer = lView[RENDERER];
14145
14035
  if (isProceduralRenderer(renderer) && renderer.destroyNode) {
14146
- walkTNodeTree(view, 2 /* Destroy */, renderer, null);
14036
+ executeActionOnView(renderer, 2 /* Destroy */, lView, null, null);
14147
14037
  }
14148
- destroyViewTree(view);
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 != null) {
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 e_2, _a;
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 (e_2_1) { e_2 = { error: e_2_1 }; }
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 (e_2) throw e_2.error; }
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 VLview)
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
- var ngContainerChildTNode = projectedTNode.child;
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(lContainer[PARENT]);
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(index, value) {
16649
- if (value !== NO_CHANGE) {
16650
- var lView = getLView();
16651
- ngDevMode && assertDataInRange(lView, index + HEADER_OFFSET);
16652
- var element = getNativeByIndex(index, lView);
16653
- ngDevMode && assertDefined(element, 'native element should exist');
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
- ɵɵtextBinding(index, ɵɵinterpolation1(prefix, v0, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolation2(prefix, v0, i0, v1, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolation3(prefix, v0, i0, v1, i1, v2, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolation4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolation5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolation6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolation7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolation8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix));
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
- ɵɵtextBinding(index, ɵɵinterpolationV(values));
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
- * text(0);
18093
+ * ɵɵtext(0);
18017
18094
  * }
18018
18095
  * if (fs & RenderFlags.Update) {
18019
- * textBinding(0, bind(ctx.greeter.greet()));
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) { return this._viewRefs[index] || null; };
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._viewRefs.splice(adjustedIdx, 0, viewRef);
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._viewRefs.splice(adjustedIdx, 0, viewRef);
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) { return this._viewRefs.indexOf(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._viewRefs.splice(adjustedIdx, 1);
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._viewRefs.splice(adjustedIdx, 1)[0] != null;
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
- /** Returns a Renderer2 (or throws when application was bootstrapped with Renderer3) */
18883
+ /** Injects a Renderer2 for the current component. */
18778
18884
  function injectRenderer2() {
18779
- return getOrCreateRenderer2(getLView());
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.0-next.2');
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
- ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');
22226
- this.destroyCbs.forEach(function (fn) { return fn(); });
22227
- this.destroyCbs = null;
22228
- !this.hostView.destroyed && this.hostView.destroy();
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
- ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');
22232
- this.destroyCbs.push(callback);
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
- ɵɵtextBinding(nodeIndex, value);
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 expression The binding's new value or NO_CHANGE
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(expression) {
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
- return Object.keys(placeholders).length ?
23567
- input.replace(LOCALIZE_PH_REGEXP, function (match, key) { return placeholders[key] || ''; }) :
23568
- input;
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 matchingIdx = locateDirectiveOrProvider(tNode, currentView, read, false, false);
24790
+ var tView = currentView[TVIEW];
24791
+ var matchingIdx = locateDirectiveOrProvider(tNode, tView, read, false, false);
24677
24792
  if (matchingIdx !== null) {
24678
- return getNodeInjectable(currentView[TVIEW].data, currentView, matchingIdx, tNode);
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 currentView = getLView();
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, currentView, predicate.read);
24843
+ result = queryByTemplateRef(type, tNode, lView, predicate.read);
24728
24844
  }
24729
24845
  else {
24730
- var matchingIdx = locateDirectiveOrProvider(tNode, currentView, type, false, false);
24846
+ var matchingIdx = locateDirectiveOrProvider(tNode, tView, type, false, false);
24731
24847
  if (matchingIdx !== null) {
24732
- result = queryRead(tNode, currentView, predicate.read, matchingIdx);
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, currentView, predicate.read, matchingIdx);
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
- * Binds a CSS event to a host listener and supplies configuration metadata.
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;