-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
/
helper.js
121 lines (99 loc) · 2.81 KB
/
helper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**
@module ember
@submodule ember-templates
*/
import Object from 'ember-runtime/system/object';
/**
Ember Helpers are functions that can compute values, and are used in templates.
For example, this code calls a helper named `format-currency`:
```handlebars
<div>{{format-currency cents currency="$"}}</div>
```
Additionally a helper can be called as a nested helper (sometimes called a
subexpression). In this example, the computed value of a helper is passed
to a component named `show-money`:
```handlebars
{{show-money amount=(format-currency cents currency="$")}}
```
Helpers defined using a class must provide a `compute` function. For example:
```js
export default Ember.Helper.extend({
compute(params, hash) {
let cents = params[0];
let currency = hash.currency;
return `${currency}${cents * 0.01}`;
}
});
```
Each time the input to a helper changes, the `compute` function will be
called again.
As instances, these helpers also have access to the container an will accept
injected dependencies.
Additionally, class helpers can call `recompute` to force a new computation.
@class Ember.Helper
@public
@since 1.13.0
*/
var Helper = Object.extend({
isHelperInstance: true,
/**
On a class-based helper, it may be useful to force a recomputation of that
helpers value. This is akin to `rerender` on a component.
For example, this component will rerender when the `currentUser` on a
session service changes:
```js
// app/helpers/current-user-email.js
export default Ember.Helper.extend({
session: Ember.inject.service(),
onNewUser: Ember.observer('session.currentUser', function() {
this.recompute();
}),
compute() {
return this.get('session.currentUser.email');
}
});
```
@method recompute
@public
@since 1.13.0
*/
recompute() {
this._stream.notify();
}
/**
Override this function when writing a class-based helper.
@method compute
@param {Array} params The positional arguments to the helper
@param {Object} hash The named arguments to the helper
@public
@since 1.13.0
*/
});
Helper.reopenClass({
isHelperFactory: true
});
/**
In many cases, the ceremony of a full `Ember.Helper` class is not required.
The `helper` method create pure-function helpers without instances. For
example:
```js
// app/helpers/format-currency.js
export default Ember.Helper.helper(function(params, hash) {
let cents = params[0];
let currency = hash.currency;
return `${currency}${cents * 0.01}`;
});
```
@static
@param {Function} helper The helper function
@method helper
@public
@since 1.13.0
*/
export function helper(helperFn) {
return {
isHelperInstance: true,
compute: helperFn
};
}
export default Helper;