Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deprecation guide for (action) / {{action}} #1377

Merged
merged 7 commits into from
May 2, 2024
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 170 additions & 0 deletions content/ember/v5/deprecate-template-action.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
---
title: Action helper and modifier
until: 6.0.0
since: 5.9.0
---

### Scenario: `action` is passed a string

Before:
```handlebars
<button type="button" {{action "plusOne"}}>
Click Me
</button>
```

After

```handlebars
<button type="button" {{on 'click' this.plusOne}}>
Click Me
</button>
```
or, if `plusOne` is passed in as an argument
```handlebars
<button type="button" {{on 'click' @plusOne}}>
Click Me
</button>
```

If the `plusOne` action is in an actions object, it needs to move out:
NullVoxPopuli marked this conversation as resolved.
Show resolved Hide resolved

Before:
```javascript
import Component from '@glimmer/component';

export default class Demo extends Component {
actions = {
plusOne() {
/* ... */
}
}
}
```
After:
```javascript
import Component from '@glimmer/component';
import { action } from '@ember/object';

export default class Demo extends Component {
@action
plusOne() {
/* ... */
}
}
```

or

Before:
```javascript
import Component from '@ember/component';

export default class Demo extends Component {
actions = {
plusOne() {
/* ... */
}
}
}
```

After:
```javascript
import Component from '@ember/component';
import { action } from '@ember/object';

export default class Demo extends Component {
@action
plusOne() {
/* ... */
}
}
```
or

Before:
```javascript
import Component from '@ember/component';

export default Component.extend({
actions: {
plusOne() {
/* ... */
}
}
})
```

After:
```javascript
import Component from '@ember/component';
import { action } from '@ember/object';

export default Component.extend({
plusOne: action(function() {
/* ... */
}),
})
achambers marked this conversation as resolved.
Show resolved Hide resolved
```

If `(action)` or `{{action}}` is passed a string, it's _possible_ that the referenced method is declared on the caller, and _not_ the immediate component -- that is, `(action)` and `{{action}}` bubble up the render tree.
achambers marked this conversation as resolved.
Show resolved Hide resolved

Note that `@action` is completely different from `(action)` or `{{action}}` (and is partly a motivator for deprecating `(action)` and `{{action}}`, to reduce ambiguity).

`@action` is binds the `this` on the method to the instance of the class.
NullVoxPopuli marked this conversation as resolved.
Show resolved Hide resolved


### Scenario: `action` is passed a function reference

Before:
```handlebars
<SomeComponent @update={{action this.plusOne}} />
```

After

```handlebars
<SomeComponent @update={{this.plusOne}} />
```

### Scenario: `action` is passed parameters

Before:
```handlebars
<SomeComponent @update={{action this.plus 1}} />
```

After:
```handlebars
<SomeComponent @update={{fn this.plus 1}} />
```

### Scenario: `action` is used with `mut`

Before:
```handlebars
<SomeComponent @update={{action (mut @value.property}} />
```
After:
```javascript
// parent.js
import Component from '@glimmer/component';
import { action } from '@ember/object';

export default class SomeComponent extends Component {
@action
handleUpdate(value) {
this.args.property = value;
}
}
```
```handlebars
{{! parent.hbs }}
<SomeComponent @update={{this.handleUpdate}} />
```

Related, [Combining function arguments with action functions](https://guides.emberjs.com/release/components/component-state-and-actions/#toc_combining-arguments-and-actions)


For more background, read the [RFC](https://github.com/emberjs/rfcs/pull/1006)
Loading