Angle Bracket Invocation for Built-In Components (3.10)
This feature gives the LinkTo, Input, and Textarea helpers a makeover in the form of three new angle-bracket components.
Summary
- Ember 3.10 Release
- Angle Bracket Invocations for Built-in Components RFC #459
- Ember Angle Brackets Codemod
- Ember Angle Bracket Polyfill
- LinkTo API docs
- Input API docs
- Textarea API Docs
The next new feature in 3.10 is the angle-bracket version of Ember's three built-in helpers: {{link-to}}
, {{input}}
and {{textarea}}
.
Link To
The curly version of {{link-to}}
has two forms, inline and block:
{{link-to "Static route inline label" "static-route"}}
{{#link-to "static-route"}}
Static route block label
{{/link-to}}
Here's how that same link looks using the new Angle Bracket <LinkTo>
component:
<LinkTo @route="static-route">
Static route label
</LinkTo>
As we learned in the previous episode, Angle Bracket components take no positional params. Instead, the Angle Bracket version of <LinkTo>
exposes a route
argument. It also only works in the block form – there's no inline equivalent.
What about models? {{link-to}}
accepts a list of models for routes with dynamic segments:
{{#link-to "dynamic-route" "slug-1"}}
Dynamic block label
{{/link-to}}
For routes with a single model, you can use the new @model
arg
<LinkTo @route="dynamic-route" @model="slug-1">
Dynamic block label
</LinkTo>
and for routes with multiple models, use the @models
arg along with the {{array}}
helper:
<LinkTo
@route="dynamic-route.dynamic-child"
@models={{array "slug-1" "child-slug-1"}}
>
Dynamic block label
</LinkTo>
Input
The {{input}}
helper has been a mainstay in Ember for years. Now, we have the <Input>
component.
Typical use of {{input}}
looks like this:
{{input value=this.name placeholder="name"}}
The <Input>
component looks like this:
<Input @value={{this.name}} placeholder="name">
It exposes the @value
arg for data binding, but note that the placeholder
attribute is not prefixed with @
. This is another example of the clarity Angle Bracket components bring to our templates.
In addition to the @value
argument, <Input>
also exposes @type
and @checked
. So a checkbox looks like this:
<Input @type="checkbox" @checked={{this.isAdmin}}>
Every other attribute you might want to set on an <input>
DOM element, you can set as a normal (unprefixed) attribute on the component.
Textarea
The last new built-in component is <Textarea>
. The helper version looked like this
{{textarea value=this.body placeholder="Write something"}}
and the Angle Bracket looks like this:
<Textarea @value={{this.body}} placeholder="Write something">
Pretty straightforward!
Be sure to check out the Angle Brackets codemod to help convert over your existing codebase. It works on both user-defined components, as well as the three new built-ins we just covered. It's an absolutely wonderful project!