ember-source 7.3.0-alpha.5 → 7.4.0-alpha.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/build-metadata.json +3 -3
- package/dist/dev/packages/@ember/-internals/deprecations/index.js +9 -0
- package/dist/dev/packages/@ember/-internals/glimmer/index.js +7 -7
- package/dist/dev/packages/@ember/-internals/routing/index.js +2 -2
- package/dist/dev/packages/@ember/-internals/runtime/index.js +1 -1
- package/dist/dev/packages/@ember/-internals/runtime/lib/ext/rsvp.js +1 -1
- package/dist/dev/packages/@ember/-internals/runtime/lib/mixins/action_handler.js +4 -0
- package/dist/dev/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +3 -0
- package/dist/dev/packages/@ember/-internals/views/lib/mixins/action_support.js +2 -0
- package/dist/dev/packages/@ember/application/index.js +3 -3
- package/dist/dev/packages/@ember/application/instance.js +9 -9
- package/dist/dev/packages/@ember/component/helper.js +2 -2
- package/dist/dev/packages/@ember/component/index.js +3 -3
- package/dist/dev/packages/@ember/engine/index.js +3 -3
- package/dist/dev/packages/@ember/engine/instance.js +1 -1
- package/dist/dev/packages/@ember/helper/index.js +1132 -79
- package/dist/dev/packages/@ember/modifier/on.js +1 -1
- package/dist/dev/packages/@ember/object/compat.js +0 -32
- package/dist/dev/packages/@ember/renderer/index.js +1 -1
- package/dist/dev/packages/@ember/routing/-internals.js +2 -2
- package/dist/dev/packages/@ember/routing/index.js +11 -28
- package/dist/dev/packages/@ember/routing/lib/utils.js +2 -2
- package/dist/dev/packages/@ember/routing/route.js +2 -2
- package/dist/dev/packages/@ember/routing/router-service.js +9 -9
- package/dist/dev/packages/@ember/routing/router.js +2 -2
- package/dist/dev/packages/@ember/template-compiler/lib/compile-options.js +3 -3
- package/dist/dev/packages/@ember/template-compiler/lib/template.js +2 -2
- package/dist/dev/packages/@ember/template-factory/index.js +1 -1
- package/dist/dev/packages/@glimmer/opcode-compiler/index.js +2 -2
- package/dist/dev/packages/@glimmer/program/index.js +3 -3
- package/dist/dev/packages/@glimmer/runtime/index.js +7 -7
- package/dist/dev/packages/@glimmer/wire-format/index.js +2 -5
- package/dist/dev/packages/ember/version.js +1 -1
- package/dist/dev/packages/ember-template-compiler/index.js +2 -2
- package/dist/dev/packages/router_js/index.js +2 -2
- package/dist/dev/packages/rsvp/index.js +1 -2281
- package/dist/dev/packages/shared-chunks/{arguments-CDkbOqTS.js → arguments-DniR8eF2.js} +5 -18
- package/dist/dev/packages/shared-chunks/{compiler-QUSl_urU.js → compiler-BHFFl-fv.js} +1 -1
- package/dist/dev/packages/shared-chunks/{curly-BbL6STF2.js → curly-BCD_vyHq.js} +1 -1
- package/dist/dev/packages/shared-chunks/{element-BYLB-q7a.js → element-Cgoi4ldD.js} +0 -24
- package/dist/dev/packages/shared-chunks/get-zsePWrJL.js +40 -0
- package/dist/dev/packages/shared-chunks/hash-BFu91gtE.js +57 -0
- package/dist/dev/packages/shared-chunks/{index-DaFzpTIE.js → index-BYUSIu_W.js} +3 -3
- package/dist/dev/packages/shared-chunks/{index-Czn34wUZ.js → index-Bv9SQpEx.js} +218 -78
- package/dist/dev/packages/shared-chunks/{invoke-d9sqa50M.js → invoke-CgF42joE.js} +1 -1
- package/dist/dev/packages/shared-chunks/{not-DYh6AY9Z.js → not-0cVb-rLf.js} +1 -1
- package/dist/dev/packages/shared-chunks/{on-DlF0Wy7P.js → on-CVIjn2C-.js} +22 -11
- package/dist/dev/packages/shared-chunks/{opcodes-CplRyHl_.js → opcodes-DDajoGhq.js} +0 -4
- package/dist/dev/packages/shared-chunks/{outlet-B4qORyui.js → outlet-BO5-QFmm.js} +3 -3
- package/dist/dev/packages/shared-chunks/{program-context-Dq8xN2HI.js → program-context-BBB1Ga5h.js} +2 -2
- package/dist/dev/packages/shared-chunks/{render-CtH73XOv.js → render-D_Rawf-r.js} +2 -2
- package/dist/{prod/packages/shared-chunks/rsvp.es-DR7yS7qg.js → dev/packages/shared-chunks/rsvp-aLN_pQtn.js} +152 -148
- package/dist/dev/packages/shared-chunks/{setup-registry-h519ZsHS.js → setup-registry-Ci8Af2Bz.js} +35 -13
- package/dist/{prod/packages/shared-chunks/syscall-ops-CN7STuUn.js → dev/packages/shared-chunks/syscall-ops-CkPT1Kfx.js} +1 -2
- package/dist/dev/packages/shared-chunks/{textarea-DEvw4ezm.js → textarea-DvS6Xmdh.js} +3 -23
- package/dist/dev/packages/shared-chunks/{unique-id-DQOhouG1.js → unique-id-Csxuh1I7.js} +0 -4
- package/dist/dev/packages/shared-chunks/{unrecognized-url-error-B8loxkay.js → unrecognized-url-error-cXUp-SK3.js} +1 -1
- package/dist/prod/packages/@ember/-internals/deprecations/index.js +9 -0
- package/dist/prod/packages/@ember/-internals/glimmer/index.js +7 -7
- package/dist/prod/packages/@ember/-internals/routing/index.js +2 -2
- package/dist/prod/packages/@ember/-internals/runtime/index.js +1 -1
- package/dist/prod/packages/@ember/-internals/runtime/lib/ext/rsvp.js +1 -1
- package/dist/prod/packages/@ember/-internals/runtime/lib/mixins/action_handler.js +4 -0
- package/dist/prod/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +3 -0
- package/dist/prod/packages/@ember/-internals/views/lib/mixins/action_support.js +2 -0
- package/dist/prod/packages/@ember/application/index.js +3 -3
- package/dist/prod/packages/@ember/application/instance.js +9 -9
- package/dist/prod/packages/@ember/component/helper.js +2 -2
- package/dist/prod/packages/@ember/component/index.js +3 -3
- package/dist/prod/packages/@ember/engine/index.js +3 -3
- package/dist/prod/packages/@ember/engine/instance.js +1 -1
- package/dist/prod/packages/@ember/helper/index.js +1132 -79
- package/dist/prod/packages/@ember/modifier/on.js +1 -1
- package/dist/prod/packages/@ember/object/compat.js +0 -32
- package/dist/prod/packages/@ember/renderer/index.js +1 -1
- package/dist/prod/packages/@ember/routing/index.js +10 -27
- package/dist/prod/packages/@ember/routing/lib/utils.js +2 -2
- package/dist/prod/packages/@ember/routing/route.js +2 -2
- package/dist/prod/packages/@ember/routing/router-service.js +9 -9
- package/dist/prod/packages/@ember/routing/router.js +2 -2
- package/dist/prod/packages/@ember/template-compiler/lib/compile-options.js +3 -3
- package/dist/prod/packages/@ember/template-compiler/lib/template.js +2 -2
- package/dist/prod/packages/@ember/template-factory/index.js +1 -1
- package/dist/prod/packages/@glimmer/opcode-compiler/index.js +2 -2
- package/dist/prod/packages/@glimmer/program/index.js +3 -3
- package/dist/prod/packages/@glimmer/runtime/index.js +7 -7
- package/dist/prod/packages/@glimmer/wire-format/index.js +2 -5
- package/dist/prod/packages/ember/version.js +1 -1
- package/dist/prod/packages/ember-template-compiler/index.js +2 -2
- package/dist/prod/packages/router_js/index.js +2 -2
- package/dist/prod/packages/rsvp/index.js +1 -2281
- package/dist/prod/packages/shared-chunks/{arguments-BzAkZVBa.js → arguments-CCYATlEH.js} +1 -18
- package/dist/prod/packages/shared-chunks/{compiler-lBSssiWp.js → compiler-Wt5SWcrF.js} +1 -1
- package/dist/prod/packages/shared-chunks/{curly-CU2jYOtm.js → curly-CdvJuTyW.js} +1 -1
- package/dist/prod/packages/shared-chunks/{element-DgHdPZ8u.js → element-BmBjPjkQ.js} +0 -24
- package/dist/prod/packages/shared-chunks/get-CEjFJzGs.js +40 -0
- package/dist/prod/packages/shared-chunks/hash-BitfXhCx.js +57 -0
- package/dist/prod/packages/shared-chunks/{index-XmtQRWbX.js → index-D8cl-pfl.js} +218 -78
- package/dist/prod/packages/shared-chunks/{index-Bf53M8eS.js → index-kwuZeaNz.js} +3 -3
- package/dist/prod/packages/shared-chunks/{invoke-DhQ5QRp2.js → invoke-4JGJYH7Z.js} +1 -1
- package/dist/prod/packages/shared-chunks/{not-BOIVROuv.js → not-Dn5s9qVZ.js} +1 -1
- package/dist/prod/packages/shared-chunks/{on-BZHAxzdq.js → on-ov4KAucw.js} +22 -11
- package/dist/prod/packages/shared-chunks/{opcodes-CplRyHl_.js → opcodes-DDajoGhq.js} +0 -4
- package/dist/prod/packages/shared-chunks/{outlet-CsNMfeOj.js → outlet-BWnaVOrA.js} +3 -3
- package/dist/prod/packages/shared-chunks/{program-context-COSioH46.js → program-context-WVlzpPdi.js} +2 -2
- package/dist/prod/packages/shared-chunks/{render-Bf7GviCY.js → render-BAVl5E6X.js} +2 -2
- package/dist/{dev/packages/shared-chunks/rsvp.es-DR7yS7qg.js → prod/packages/shared-chunks/rsvp-aLN_pQtn.js} +152 -148
- package/dist/prod/packages/shared-chunks/{setup-registry-DFSQHIUs.js → setup-registry-DeyoFe6Q.js} +35 -13
- package/dist/{dev/packages/shared-chunks/syscall-ops-CN7STuUn.js → prod/packages/shared-chunks/syscall-ops-CkPT1Kfx.js} +1 -2
- package/dist/prod/packages/shared-chunks/{textarea-DMmdvgk2.js → textarea-B-sssXGa.js} +3 -23
- package/dist/prod/packages/shared-chunks/{unique-id-o2pS74go.js → unique-id-BJb1p8EG.js} +0 -4
- package/dist/prod/packages/shared-chunks/{unrecognized-url-error-jjQ-FqKB.js → unrecognized-url-error-xC654tCo.js} +1 -1
- package/docs/data.json +1237 -1395
- package/package.json +52 -47
- package/types/stable/@ember/-internals/deprecations/index.d.ts +6 -0
- package/types/stable/@ember/-internals/glimmer/index.d.ts +7 -380
- package/types/stable/@ember/-internals/glimmer/lib/component.d.ts +1 -1
- package/types/stable/@ember/-internals/glimmer/lib/helper.d.ts +2 -2
- package/types/stable/@ember/-internals/glimmer/lib/helpers/each-in.d.ts +196 -63
- package/types/stable/@ember/-internals/glimmer/lib/helpers/element.d.ts +0 -24
- package/types/stable/@ember/-internals/glimmer/lib/helpers/mut.d.ts +3 -2
- package/types/stable/@ember/-internals/glimmer/lib/helpers/readonly.d.ts +3 -1
- package/types/stable/@ember/-internals/glimmer/lib/helpers/unbound.d.ts +6 -2
- package/types/stable/@ember/-internals/glimmer/lib/helpers/unique-id.d.ts +0 -3
- package/types/stable/@ember/-internals/glimmer/lib/syntax/mount.d.ts +4 -2
- package/types/stable/@ember/-internals/glimmer/lib/syntax/outlet.d.ts +7 -2
- package/types/stable/@ember/helper/index.d.ts +1113 -73
- package/types/stable/@ember/object/compat.d.ts +0 -32
- package/types/stable/@ember/object/core.d.ts +1 -1
- package/types/stable/@ember/routing/router-service.d.ts +9 -9
- package/types/stable/@glimmer/interfaces/lib/compile/wire-format/api.d.ts +1 -9
- package/types/stable/@glimmer/interfaces/lib/compile/wire-format/opcodes.d.ts +0 -4
- package/types/stable/@glimmer/interfaces/lib/vm-opcodes.d.ts +0 -4
- package/types/stable/@glimmer/opcode-compiler/lib/opcode-builder/helpers/conditional.d.ts +1 -1
- package/types/stable/@glimmer/opcode-compiler/lib/syntax/statements.d.ts +1 -1
- package/types/stable/@glimmer/runtime/lib/helpers/array.d.ts +0 -33
- package/types/stable/@glimmer/runtime/lib/helpers/concat.d.ts +0 -25
- package/types/stable/@glimmer/runtime/lib/helpers/fn.d.ts +0 -70
- package/types/stable/@glimmer/runtime/lib/helpers/get.d.ts +0 -69
- package/types/stable/@glimmer/runtime/lib/helpers/hash.d.ts +0 -36
- package/types/stable/index.d.ts +0 -14
- package/dist/dev/packages/shared-chunks/get-6I3sjd-I.js +0 -135
- package/dist/dev/packages/shared-chunks/hash-6NDs_5_f.js +0 -198
- package/dist/prod/packages/shared-chunks/get-Dago5uGl.js +0 -135
- package/dist/prod/packages/shared-chunks/hash-gEXIsSO4.js +0 -198
- package/types/stable/@ember/-internals/glimmer/lib/helpers/array.d.ts +0 -43
- package/types/stable/@ember/-internals/glimmer/lib/helpers/component.d.ts +0 -93
- package/types/stable/@ember/-internals/glimmer/lib/helpers/concat.d.ts +0 -32
- package/types/stable/@ember/-internals/glimmer/lib/helpers/fn.d.ts +0 -77
- package/types/stable/@ember/-internals/glimmer/lib/helpers/get.d.ts +0 -94
- package/types/stable/@ember/-internals/glimmer/lib/helpers/hash.d.ts +0 -46
- package/types/stable/@ember/-internals/glimmer/lib/helpers/helper.d.ts +0 -43
- package/types/stable/@ember/-internals/glimmer/lib/helpers/if-unless.d.ts +0 -228
- package/types/stable/@ember/-internals/glimmer/lib/helpers/log.d.ts +0 -19
- package/types/stable/@ember/-internals/glimmer/lib/helpers/modifier.d.ts +0 -42
- package/types/stable/@ember/-internals/glimmer/lib/helpers/page-title.d.ts +0 -24
- package/types/stable/@ember/-internals/glimmer/lib/modifiers/on.d.ts +0 -95
- package/types/stable/@ember/-internals/glimmer/lib/syntax/in-element.d.ts +0 -49
- package/types/stable/@ember/-internals/glimmer/lib/syntax/let.d.ts +0 -43
|
@@ -6,45 +6,90 @@ declare module '@ember/-internals/glimmer/lib/helpers/each-in' {
|
|
|
6
6
|
The default behavior of `{{#each}}` is to yield its inner block once for every
|
|
7
7
|
item in an array passing the item as the first block parameter.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
```gjs {data-filename="app/components/developer-list.gjs"}
|
|
10
|
+
import Component from '@glimmer/component';
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
export default class DeveloperList extends Component {
|
|
13
|
+
developers = [
|
|
14
|
+
{ name: 'Yehuda' },
|
|
15
|
+
{ name: 'Tom' },
|
|
16
|
+
{ name: 'Paul' },
|
|
17
|
+
];
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
<template>
|
|
20
|
+
<ul>
|
|
21
|
+
{{#each this.developers as |person|}}
|
|
22
|
+
<li>Hello, {{person.name}}!</li>
|
|
23
|
+
{{/each}}
|
|
24
|
+
</ul>
|
|
25
|
+
</template>
|
|
26
|
+
}
|
|
21
27
|
```
|
|
22
28
|
|
|
23
|
-
The same rules apply to arrays of primitives
|
|
29
|
+
The same rules apply to arrays of primitives:
|
|
30
|
+
|
|
31
|
+
```gjs {data-filename="app/components/developer-names.gjs"}
|
|
32
|
+
import Component from '@glimmer/component';
|
|
33
|
+
|
|
34
|
+
export default class DeveloperNames extends Component {
|
|
35
|
+
developerNames = ['Yehuda', 'Tom', 'Paul'];
|
|
24
36
|
|
|
25
|
-
|
|
26
|
-
|
|
37
|
+
<template>
|
|
38
|
+
<ul>
|
|
39
|
+
{{#each this.developerNames as |name|}}
|
|
40
|
+
<li>Hello, {{name}}!</li>
|
|
41
|
+
{{/each}}
|
|
42
|
+
</ul>
|
|
43
|
+
</template>
|
|
44
|
+
}
|
|
27
45
|
```
|
|
28
46
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
47
|
+
`{{#each}}` also supports native JavaScript [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)
|
|
48
|
+
values and other iterables:
|
|
49
|
+
|
|
50
|
+
```gjs {data-filename="app/components/developer-set.gjs"}
|
|
51
|
+
import Component from '@glimmer/component';
|
|
52
|
+
|
|
53
|
+
export default class DeveloperSet extends Component {
|
|
54
|
+
developers = new Set([
|
|
55
|
+
{ name: 'Yehuda' },
|
|
56
|
+
{ name: 'Tom' },
|
|
57
|
+
{ name: 'Paul' },
|
|
58
|
+
]);
|
|
59
|
+
|
|
60
|
+
<template>
|
|
61
|
+
<ul>
|
|
62
|
+
{{#each this.developers as |person|}}
|
|
63
|
+
<li>Hello, {{person.name}}!</li>
|
|
64
|
+
{{/each}}
|
|
65
|
+
</ul>
|
|
66
|
+
</template>
|
|
67
|
+
}
|
|
35
68
|
```
|
|
36
69
|
|
|
37
|
-
During iteration, the index of each item in the array is provided as a second
|
|
38
|
-
parameter
|
|
70
|
+
During iteration, the index of each item in the array is provided as a second
|
|
71
|
+
block parameter:
|
|
39
72
|
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
73
|
+
```gjs {data-filename="app/components/developer-list-with-index.gjs"}
|
|
74
|
+
import Component from '@glimmer/component';
|
|
75
|
+
|
|
76
|
+
export default class DeveloperListWithIndex extends Component {
|
|
77
|
+
developers = [
|
|
78
|
+
{ name: 'Yehuda' },
|
|
79
|
+
{ name: 'Tom' },
|
|
80
|
+
{ name: 'Paul' },
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
<template>
|
|
84
|
+
<ul>
|
|
85
|
+
{{#each this.developers as |person index|}}
|
|
86
|
+
<li>Hello, {{person.name}}! You're number {{index}} in line</li>
|
|
87
|
+
{{/each}}
|
|
88
|
+
</ul>
|
|
89
|
+
</template>
|
|
90
|
+
}
|
|
46
91
|
```
|
|
47
|
-
|
|
92
|
+
|
|
48
93
|
`#each` is a keyword and does not need to be imported.
|
|
49
94
|
|
|
50
95
|
### Specifying Keys
|
|
@@ -61,71 +106,90 @@ declare module '@ember/-internals/glimmer/lib/helpers/each-in' {
|
|
|
61
106
|
needed. However, in some rare cases, the objects' identities may change even
|
|
62
107
|
though they represent the same underlying data.
|
|
63
108
|
|
|
64
|
-
For example
|
|
109
|
+
For example, mapping over `people` produces a new array of new objects on each
|
|
110
|
+
render. Use `key` so Ember can match items across those renders:
|
|
65
111
|
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
return { ...person, type: 'developer' };
|
|
69
|
-
});
|
|
70
|
-
```
|
|
112
|
+
```gjs {data-filename="app/components/mapped-developers.gjs"}
|
|
113
|
+
import Component from '@glimmer/component';
|
|
71
114
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
115
|
+
export default class MappedDevelopers extends Component {
|
|
116
|
+
people = [
|
|
117
|
+
{ name: 'Yehuda' },
|
|
118
|
+
{ name: 'Tom' },
|
|
119
|
+
{ name: 'Paul' },
|
|
120
|
+
];
|
|
76
121
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
122
|
+
get developers() {
|
|
123
|
+
return this.people.map((person) => {
|
|
124
|
+
return { ...person, type: 'developer' };
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
<template>
|
|
129
|
+
<ul>
|
|
130
|
+
{{#each this.developers key="name" as |person|}}
|
|
131
|
+
<li>Hello, {{person.name}}!</li>
|
|
132
|
+
{{/each}}
|
|
133
|
+
</ul>
|
|
134
|
+
</template>
|
|
135
|
+
}
|
|
83
136
|
```
|
|
84
137
|
|
|
85
138
|
By doing so, Ember will use the value of the property specified (`person.name`
|
|
86
139
|
in the example) to find a "match" from the previous render. That is, if Ember
|
|
87
|
-
has previously seen an object from the
|
|
140
|
+
has previously seen an object from the `developers` array with a matching
|
|
88
141
|
name, its DOM elements will be re-used.
|
|
89
142
|
|
|
90
143
|
There are two special values for `key`:
|
|
91
144
|
|
|
145
|
+
* `@identity` - The item in the array itself. This is the default.
|
|
92
146
|
* `@index` - The index of the item in the array.
|
|
93
|
-
* `@identity` - The item in the array itself.
|
|
94
147
|
|
|
95
148
|
### {{else}} condition
|
|
96
149
|
|
|
97
150
|
`{{#each}}` can have a matching `{{else}}`. The contents of this block will render
|
|
98
151
|
if the collection is empty.
|
|
99
152
|
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
153
|
+
```gjs {data-filename="app/components/available-developers.gjs"}
|
|
154
|
+
import Component from '@glimmer/component';
|
|
155
|
+
|
|
156
|
+
export default class AvailableDevelopers extends Component {
|
|
157
|
+
developers = [];
|
|
158
|
+
|
|
159
|
+
<template>
|
|
160
|
+
<ul>
|
|
161
|
+
{{#each this.developers as |person|}}
|
|
162
|
+
<li>{{person.name}} is available!</li>
|
|
163
|
+
{{else}}
|
|
164
|
+
<li>Sorry, nobody is available for this task.</li>
|
|
165
|
+
{{/each}}
|
|
166
|
+
</ul>
|
|
167
|
+
</template>
|
|
168
|
+
}
|
|
108
169
|
```
|
|
109
170
|
|
|
110
171
|
@method each
|
|
111
|
-
@for
|
|
172
|
+
@for Keywords
|
|
173
|
+
@static
|
|
174
|
+
@noimport
|
|
112
175
|
@public
|
|
113
176
|
*/
|
|
114
177
|
/**
|
|
115
|
-
The `{{#each-in}}` keyword loops over properties on an object
|
|
178
|
+
The `{{#each-in}}` keyword loops over properties on an object, or entries in a
|
|
179
|
+
native JavaScript [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map).
|
|
116
180
|
|
|
117
181
|
For example, given this component definition:
|
|
118
182
|
|
|
119
|
-
```app/components/developer-details.gjs
|
|
183
|
+
```gjs {data-filename="app/components/developer-details.gjs"}
|
|
120
184
|
import Component from '@glimmer/component';
|
|
121
185
|
import { tracked } from '@glimmer/tracking';
|
|
122
186
|
|
|
123
|
-
export default class extends Component {
|
|
187
|
+
export default class DeveloperDetails extends Component {
|
|
124
188
|
@tracked developer = {
|
|
125
|
-
|
|
126
|
-
|
|
189
|
+
name: 'Shelly Sails',
|
|
190
|
+
age: 42,
|
|
127
191
|
};
|
|
128
|
-
|
|
192
|
+
|
|
129
193
|
<template>
|
|
130
194
|
<ul>
|
|
131
195
|
{{#each-in this.developer as |key value|}}
|
|
@@ -145,11 +209,80 @@ declare module '@ember/-internals/glimmer/lib/helpers/each-in' {
|
|
|
145
209
|
<li>age: 42</li>
|
|
146
210
|
</ul>
|
|
147
211
|
```
|
|
148
|
-
|
|
212
|
+
|
|
213
|
+
The same pattern works with a `Map`:
|
|
214
|
+
|
|
215
|
+
```gjs {data-filename="app/components/developer-map.gjs"}
|
|
216
|
+
import Component from '@glimmer/component';
|
|
217
|
+
|
|
218
|
+
export default class DeveloperMap extends Component {
|
|
219
|
+
map = new Map([
|
|
220
|
+
['name', 'Shelly Sails'],
|
|
221
|
+
['age', 42],
|
|
222
|
+
]);
|
|
223
|
+
|
|
224
|
+
<template>
|
|
225
|
+
<ul>
|
|
226
|
+
{{#each-in this.map as |key value|}}
|
|
227
|
+
<li>{{key}}: {{value}}</li>
|
|
228
|
+
{{/each-in}}
|
|
229
|
+
</ul>
|
|
230
|
+
</template>
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
When a `Map` uses object keys, you can pass `key="@identity"` to explicitly
|
|
235
|
+
track entries across re-renders using the JavaScript identity of each key:
|
|
236
|
+
|
|
237
|
+
```gjs {data-filename="app/components/object-keyed-map.gjs"}
|
|
238
|
+
import Component from '@glimmer/component';
|
|
239
|
+
|
|
240
|
+
export default class ObjectKeyedMap extends Component {
|
|
241
|
+
map = new Map([
|
|
242
|
+
[{ name: 'one' }, 'foo'],
|
|
243
|
+
[{ name: 'two' }, 'bar'],
|
|
244
|
+
]);
|
|
245
|
+
|
|
246
|
+
<template>
|
|
247
|
+
<ul>
|
|
248
|
+
{{#each-in this.map key="@identity" as |key value|}}
|
|
249
|
+
<li>{{key.name}}: {{value}}</li>
|
|
250
|
+
{{/each-in}}
|
|
251
|
+
</ul>
|
|
252
|
+
</template>
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
149
256
|
`#each-in` is a keyword and does not need to be imported.
|
|
150
257
|
|
|
258
|
+
### Specifying Keys
|
|
259
|
+
|
|
260
|
+
Like `{{#each}}`, `{{#each-in}}` accepts a `key` option to decide which DOM
|
|
261
|
+
elements can be reused between renders. Since `{{#each-in}}` yields two block
|
|
262
|
+
params, the special values pick which one is used:
|
|
263
|
+
|
|
264
|
+
* `@identity` - The second block param: the property's value. This is the
|
|
265
|
+
default. Changing a value replaces that entry's DOM instead of updating it
|
|
266
|
+
in place.
|
|
267
|
+
* `@key` - The first block param: the property name, or for a `Map`, its key.
|
|
268
|
+
|
|
269
|
+
Any other string is a path, looked up on the value: `key="id"` keys each entry
|
|
270
|
+
by its `value.id`.
|
|
271
|
+
|
|
272
|
+
For example, `@key` keeps each entry's DOM as its score changes, so anything
|
|
273
|
+
stateful inside it — focus, a running transition, a component instance — survives
|
|
274
|
+
the update:
|
|
275
|
+
|
|
276
|
+
```handlebars
|
|
277
|
+
{{#each-in this.scores key="@key" as |player score|}}
|
|
278
|
+
<PlayerScore @name={{player}} @score={{score}} />
|
|
279
|
+
{{/each-in}}
|
|
280
|
+
```
|
|
281
|
+
|
|
151
282
|
@method each-in
|
|
152
|
-
@
|
|
283
|
+
@static
|
|
284
|
+
@noimport
|
|
285
|
+
@for Keywords
|
|
153
286
|
@public
|
|
154
287
|
@since 2.1.0
|
|
155
288
|
*/
|
|
@@ -2,30 +2,6 @@ declare module '@ember/-internals/glimmer/lib/helpers/element' {
|
|
|
2
2
|
/**
|
|
3
3
|
@module @ember/helper
|
|
4
4
|
*/
|
|
5
|
-
/**
|
|
6
|
-
The `element` helper lets you dynamically set the tag name of an element.
|
|
7
|
-
|
|
8
|
-
```handlebars
|
|
9
|
-
{{#let (element @tagName) as |Tag|}}
|
|
10
|
-
<Tag class="my-element">Hello</Tag>
|
|
11
|
-
{{/let}}
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
When `@tagName` is `"h1"`, this renders `<h1 class="my-element">Hello</h1>`.
|
|
15
|
-
|
|
16
|
-
When `@tagName` is an empty string `""`, the block content is rendered without
|
|
17
|
-
a wrapping element.
|
|
18
|
-
|
|
19
|
-
Passing `null`, `undefined`, or non-string values will throw an assertion error.
|
|
20
|
-
|
|
21
|
-
Changing the tag name will tear down and recreate the element and its contents.
|
|
22
|
-
|
|
23
|
-
The `element` helper is built-in and does not need to be imported.
|
|
24
|
-
|
|
25
|
-
@method element
|
|
26
|
-
@for Ember.Templates.helpers
|
|
27
|
-
@public
|
|
28
|
-
*/
|
|
29
5
|
const _default: object;
|
|
30
6
|
export default _default;
|
|
31
7
|
}
|
|
@@ -16,7 +16,7 @@ declare module '@ember/-internals/glimmer/lib/helpers/mut' {
|
|
|
16
16
|
|
|
17
17
|
The child `Component` would invoke the function with the new click count:
|
|
18
18
|
|
|
19
|
-
```app/components/my-child.gjs
|
|
19
|
+
```gjs {data-filename="app/components/my-child.gjs"}
|
|
20
20
|
import Component from '@glimmer/component';
|
|
21
21
|
import { action } from '@ember/object';
|
|
22
22
|
|
|
@@ -38,7 +38,8 @@ declare module '@ember/-internals/glimmer/lib/helpers/mut' {
|
|
|
38
38
|
|
|
39
39
|
@method mut
|
|
40
40
|
@param {Object} [attr] the "two-way" attribute that can be modified.
|
|
41
|
-
@
|
|
41
|
+
@static
|
|
42
|
+
@for Keywords
|
|
42
43
|
@public
|
|
43
44
|
*/
|
|
44
45
|
const _default: object;
|
|
@@ -107,7 +107,9 @@ declare module '@ember/-internals/glimmer/lib/helpers/readonly' {
|
|
|
107
107
|
|
|
108
108
|
@method readonly
|
|
109
109
|
@param {Object} [attr] the read-only attribute.
|
|
110
|
-
@for
|
|
110
|
+
@for Keywords
|
|
111
|
+
@noimport
|
|
112
|
+
@static
|
|
111
113
|
@private
|
|
112
114
|
*/
|
|
113
115
|
const _default: object;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
declare module '@ember/-internals/glimmer/lib/helpers/unbound' {
|
|
2
2
|
/**
|
|
3
|
-
@module ember
|
|
3
|
+
@module @ember/helper
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
The `{{unbound}}` helper disconnects the one-way binding of a property,
|
|
@@ -24,9 +24,13 @@ declare module '@ember/-internals/glimmer/lib/helpers/unbound' {
|
|
|
24
24
|
|
|
25
25
|
The `unbound` helper only accepts a single argument, and it return an
|
|
26
26
|
unbound value.
|
|
27
|
+
|
|
28
|
+
`unbound` is a template keyword and does not need to be imported.
|
|
27
29
|
|
|
28
30
|
@method unbound
|
|
29
|
-
@
|
|
31
|
+
@static
|
|
32
|
+
@noimport
|
|
33
|
+
@for Keywords
|
|
30
34
|
@public
|
|
31
35
|
*/
|
|
32
36
|
const _default: object;
|
|
@@ -6,7 +6,7 @@ declare module '@ember/-internals/glimmer/lib/syntax/mount' {
|
|
|
6
6
|
|
|
7
7
|
For example, the following template mounts the `ember-chat` engine:
|
|
8
8
|
|
|
9
|
-
```app/templates/application.gjs
|
|
9
|
+
```gjs {data-filename="app/templates/application.gjs"}
|
|
10
10
|
{{mount "ember-chat"}}
|
|
11
11
|
```
|
|
12
12
|
|
|
@@ -40,7 +40,9 @@ declare module '@ember/-internals/glimmer/lib/syntax/mount' {
|
|
|
40
40
|
@param {String} name Name of the engine to mount.
|
|
41
41
|
@param {Object} [model] Object that will be set as
|
|
42
42
|
the model of the engine.
|
|
43
|
-
@for
|
|
43
|
+
@for Keywords
|
|
44
|
+
@static
|
|
45
|
+
@noimport
|
|
44
46
|
@public
|
|
45
47
|
*/
|
|
46
48
|
export const mountHelper: object;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
declare module '@ember/-internals/glimmer/lib/syntax/outlet' {
|
|
2
|
+
/**
|
|
3
|
+
@module @ember/helper
|
|
4
|
+
*/
|
|
2
5
|
/**
|
|
3
6
|
The `{{outlet}}` helper lets you specify where a child route will render in
|
|
4
7
|
your template. An important use of the `{{outlet}}` helper is in your
|
|
5
8
|
application's `application.gjs` file:
|
|
6
9
|
|
|
7
|
-
```app/templates/application.gjs
|
|
10
|
+
```gjs {data-filename="app/templates/application.gjs"}
|
|
8
11
|
import MyHeader from '../components/my-header';
|
|
9
12
|
import MyFooter from '../components/my-footer';
|
|
10
13
|
|
|
@@ -27,7 +30,9 @@ declare module '@ember/-internals/glimmer/lib/syntax/outlet' {
|
|
|
27
30
|
`outlet` is built-in and does not need to be imported.
|
|
28
31
|
|
|
29
32
|
@method outlet
|
|
30
|
-
@for
|
|
33
|
+
@for Keywords
|
|
34
|
+
@static
|
|
35
|
+
@noimport
|
|
31
36
|
@public
|
|
32
37
|
*/
|
|
33
38
|
export const outletHelper: object;
|