ember-cli-async-button
provides you with a button that changes state
based on a promise in an action. We received a request a while back to allow
users to pass parameters to the action the async-button
calls. We provided
the following API for doing so:
{{async-button model action="save" default="Save" pending="Saving..."}}
The async-button
calls the following save
action:
export default Ember.Component.extend({
actions: {
save(callback, model) {
callback(model.save());
}
}
});
Notice that the callback function is still your first argument, but you get the model as the second argument now. Prior to Ember 1.13, you had to create a helper which looked through the parameters passed in, and instantiate the component, and pass the parameters down. And you had to worry about bindings and streams, so this was a bit complicated.
Positional Parameters
With the release of Ember
1.13,
components have a special property called positionalParams
, which can be an
array of strings that would translate parameters in the component instantiation
into properties on the component.
{{x-foo "Dan" "McClain"}}
// x-foo component
export default Ember.Component.extend({
positionalParams: ['firstName', 'lastName']
});
// Retrieving the values
Ember.get(this, 'firstName'); // => "Dan"
Ember.get(this, 'lastName'); // => "McClain"
"Dan"
and "McClain"
would be set as firstName
and lastName
,
respectively, on the component. You may ask “What if we want to have an
arbitrary number of parameters passed to our component?” Well, that’s handled
for you too! If positionalParams
is a string, instead of an array, the
parameters passed to your component will be an array set to that property.
{{x-foo "Dan" "McClain"}}
// x-foo component
export default Ember.Component.extend({
positionalParams: 'nameParts'
});
// Retrieving the values
Ember.get(this, 'nameParts'); // => ["Dan", "McClain"]
Cleaning up ember-cli-async-button
We no longer have to make a helper to clean up our API for async-button
, and
here is the commit where I did
so.
I set the positionalParams
here.
Note that I removed the helper that we had previously used to provide the same
API.
When you are creating a component and you want a way to pass parameters
that are not explicitly bound to properties, you can now use
positionalParams
, and not muck around with helpers and streams just to pass
info into your component!