Commit b93c6a4
committed
fix(forms): place controlCreate before listeners in signal forms template creation block
Previously, the ControlCreate IR op was inserted after the target element's
create op (ElementStart/Element), but because the ordering phase places
listeners (Listener, TwoWayListener) immediately after element-start ops, the
ControlCreate op ended up being emitted after the ElementEnd instruction.
This caused a behaviour discrepancy between [formField] and [(ngModel)]:
inside an (input) event handler, the field value reported by Signal Forms
still held the old value while ngModel already reflected the new one. The
ControlCreate runtime instruction sets up the two-way sync between the DOM
control and the field signal, so it must be called early during element
creation (before any listeners that may read the updated value).
The ControlCreate runtime instruction reads the current TNode via
getCurrentTNode(), so it must run while the target element's TNode is still
active - i.e. between its ElementStart and ElementEnd. control_directives.ts is
changed to guarantee this:
- CONTROL_OP_CREATE_KINDS no longer includes ElementEnd, ContainerEnd or
Template. ElementEnd/ContainerEnd would let the op attach after the closing
tag (parent TNode), and Template restores the parent TNode as well, so none
of them are valid insertion targets.
- findCreateInstruction now returns the *first* matching create op for a given
target xref (ElementStart or Element) instead of the last one, so ControlCreate
is always inserted immediately after the opening tag.
empty_elements.ts is intentionally left unchanged: ControlCreate is NOT added to
IGNORED_OP_KINDS. It must *block* the collapse of an empty ElementStart/ElementEnd
pair, otherwise the op would be re-parented to the collapsed element and lose the
correct TNode. As a result, an element carrying a control binding keeps its
explicit elementStart/elementEnd pair instead of collapsing to a single element()
instruction.
Compliance test golden files for two-way binding templates updated to reflect
the new (correct) instruction order: controlCreate now appears immediately after
elementStart, before the twoWayListener.
Fixes angular#68182
Related: angular#636081 parent 5ad8231 commit b93c6a4
8 files changed
Lines changed: 39 additions & 16 deletions
File tree
- packages
- compiler-cli/test/compliance/test_cases
- r3_view_compiler_bindings/control_bindings
- r3_view_compiler_listener
- compiler/src/template/pipeline/src/phases
- forms/signals/test/web
Lines changed: 2 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
| 17 | + | |
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| |||
Lines changed: 4 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
| 14 | + | |
14 | 15 | | |
| 16 | + | |
15 | 17 | | |
16 | 18 | | |
17 | 19 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | | - | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
10 | | - | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | | - | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | | - | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| |||
Lines changed: 3 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
46 | | - | |
47 | 46 | | |
48 | 47 | | |
49 | | - | |
50 | | - | |
51 | 48 | | |
52 | 49 | | |
53 | 50 | | |
54 | 51 | | |
55 | 52 | | |
56 | 53 | | |
57 | 54 | | |
58 | | - | |
59 | 55 | | |
60 | | - | |
61 | | - | |
| 56 | + | |
| 57 | + | |
62 | 58 | | |
63 | | - | |
64 | | - | |
65 | 59 | | |
66 | 60 | | |
67 | | - | |
| 61 | + | |
68 | 62 | | |
69 | 63 | | |
70 | 64 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
139 | 165 | | |
140 | 166 | | |
141 | 167 | | |
| |||
0 commit comments