angular/packages/core/src
Kristiyan Kostadinov cdf1ea1951 refactor(compiler): retrieve variables from context inside nested template listener (#40833)
This is a pre-requisite for #40360. Given the following template which has a listener
that references a variable from a parent template (`name`):

```
<ng-template let-name="name">
  <button (click)="hello(name)"></button>
</ng-template>
```

We generate code that looks that looks like. Note how we access `name` through `ctx`:

```js
function template(rf, ctx) {
  if (rf & 1) {
    const r0 = ɵɵgetCurrentView();
    ɵɵelementStart(0, "button", 2);
    ɵɵlistener("click", function() {
      ɵɵrestoreView(r0);
      const name_r0 = ctx.name; // Note the `ctx.name` access here.
      const ctx_r1 = ɵɵnextContext();
      return ctx_r1.log(name_r0);
    });
    ɵɵelementEnd();
  }
}
```

This works fine at the moment, because the template context object can't be changed after creation.
The changes in #40360 allow for the object to be changed, which means that the `ctx` reference
inside the listener will be out of date, because it was bound during creation mode.

This PR aims to address the issue by accessing the context inside listeners through the saved
view reference. With the new code, the generated code from above will look as follows:

```js
function template(rf, ctx) {
  if (rf & 1) {
    const r0 = ɵɵgetCurrentView();
    ɵɵelementStart(0, "button", 2);
    ɵɵlistener("click", function() {
      const restoredCtx = ɵɵrestoreView(r0);
      const name_r0 = restoredCtx.name;
      const ctx_r1 = ɵɵnextContext();
      return ctx_r1.log(name_r0);
    });
    ɵɵelementEnd();
  }
}
```

PR Close #40833
2021-02-17 11:45:46 -08:00
..
change_detection fix(core): make DefaultIterableDiffer keep the order of duplicates (#23941) 2021-01-26 15:44:42 -08:00
compiler refactor(compiler-cli): implement ɵɵngDeclarePipe() (#40803) 2021-02-12 09:00:16 -08:00
debug refactor(core): clean up circular dependencies (#39722) 2020-11-18 09:15:29 -08:00
di docs: format null as code fragment + fix description of returned value (#40852) 2021-02-16 09:24:49 -08:00
i18n build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
interface docs(core): Fix typo in JSDoc for AbstractType<T> (#38541) 2020-08-20 09:30:17 -07:00
linker docs: fix typo (#40566) 2021-01-25 14:55:56 -08:00
metadata docs(core): add documentation for HostListener (#40720) 2021-02-17 06:55:29 -08:00
reflection fix(ngcc): detect synthesized delegate constructors for downleveled ES2015 classes (#38463) 2020-08-17 10:55:40 -07:00
render refactor(core): clean up circular dependencies (#39722) 2020-11-18 09:15:29 -08:00
render3 refactor(compiler): retrieve variables from context inside nested template listener (#40833) 2021-02-17 11:45:46 -08:00
sanitization fix(core): ensure sanitizer works if DOMParser return null body (#40107) 2021-01-06 10:32:24 -08:00
testability build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
util fix(core): address Trusted Types bug in Chrome 83 (#40815) 2021-02-12 16:59:58 -08:00
view Revert "fix(core): remove duplicated EMPTY_ARRAY constant (#40587)" 2021-01-28 14:35:03 -08:00
zone Revert "fix(core): NgZone coaleascing options should trigger onStable correctly (#40540)" 2021-01-29 15:09:37 -08:00
application_init.ts refactor(core): Replace non-null assertion operator with property initialization (#39730) 2020-11-18 09:14:41 -08:00
application_module.ts perf(core): use ngDevMode to tree-shake warning (#40876) 2021-02-17 11:41:28 -08:00
application_ref.ts perf(core): use ngDevMode to tree-shake warning (#40876) 2021-02-17 11:41:28 -08:00
application_tokens.ts docs: clean up api doc in core (#37053) 2020-06-30 12:11:15 -07:00
change_detection.ts fix(core): remove CollectionChangeRecord symbol (#38668) 2020-09-02 16:45:19 -07:00
codegen_private_exports.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
console.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
core.externs.js build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
core.ts fix(core): do not error when ngDevMode is undeclared (#39415) 2020-10-27 10:45:18 -07:00
core_private_export.ts feat(common): allow any Subscribable in async pipe (#39627) 2020-11-23 08:28:11 -08:00
core_render3_private_export.ts refactor(compiler-cli): implement ɵɵngDeclarePipe() (#40803) 2021-02-12 09:00:16 -08:00
di.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
error_handler.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
errors.ts refactor(core): reduce the number of circular deps (#38805) 2020-09-18 11:20:08 -07:00
event_emitter.ts fix(core): ensure the type T of EventEmitter<T> can be inferred (#40644) 2021-02-03 09:07:29 -08:00
ivy_switch.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
linker.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
metadata.ts refactor(core): move injectAttributeImpl to avoid cycles (#37085) 2020-11-19 12:19:42 -08:00
platform_core_providers.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
r3_symbols.ts refactor(core): Remove circular dependency on render3 and ng_module (#39621) 2020-11-16 09:12:46 -08:00
render.ts refactor(core): clean up circular dependencies (#39722) 2020-11-18 09:15:29 -08:00
version.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
zone.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00