9
votes

In my handlebars template I have this loop:

{{#each itemController="fund"}}
    <li>                        
        <label>{{title}}</label>            
        <span>{{amount}}</span>
        {{input type="text" placeholder="new user"
        value=newFullName action="createUser"}}
        {{partial 'user-list'}}
    </li>
{{/each}}

and need to pass the current object as parameter to the 'createUser' action. Something like this:

action="createUser(this)"

or:

action 'createUser' this

But it seems that ember can't handle parameters for actions inside an input field...

Am i missing something?

4
How your "action" will be executed then? Usually you must provide something like event="click" or another way to invoke that action.Didar Burmaganov
The default is that the action is invoked on enter.user663031
I'm stuck with a similar problem! Ember tutorial (guides.emberjs.com/v2.4.0/tutorial/autocomplete-component) has {{input value=filter key-up=(action 'autoComplete' filter)}} which does not work, firing "An action named 'autoComplete' was not found in (generated index controller)".Theodore K.
This is now possible - see my answer belowandorov

4 Answers

8
votes

I think that isn't possible to do this using the action property from input view helper.

A workaround could be wrap your input in a form that use the action view helper using the submit event, like the following:

Template

{{#each}}
      <li>                   
          <form {{action "createUser" this on="submit"}}>
              {{name}}
              {{input type="text" value=name}}          
          </form>
      </li>
  {{/each}}

Route

  ...
  actions: {
    createUser: function(user) {
      alert(user.get('name'));
    }
  }
  ...

So when the user hit enter, will have the event triggered.

The main difference between the action property and the action view helper is that the action view helper is more flexible and you can supply the context and put it inside of any tag:

<div {{action "someAction" someObject}} on="click">Click me</div>

In the route:

actions: {
  someAction: function(someObject) {
    // do something with the someObject
  }
}

See the docs for further information

Please give a look in the jsfiddle to see that sample in action http://jsfiddle.net/marciojunior/UAgjX/

I hope it helps

10
votes

You can now pass a function, along with values -

submit=(action 'setName' 'Sal')

http://emberjs.com/blog/2015/06/12/ember-1-13-0-released.html#toc_closure-actions

2
votes

Finally i ended up with this solution:

Template

{{input class="newUser" type="text" value=newFullName placeholder="add user"}}
<button {{action 'createUser' this newFullName}}>Send</button>

Controller

createUser: function (fund, newFullName) {
        var fullName = newFullName;                        
        var user = this.store.createRecord('appUser', {
            fullName: fullName,                
            fund: fund,
            payments:[]
        });
        user.save().then(function(){                
            fund.get('users').pushObject(user);                
            fund.save().then(function(){
                fund.reload();
            });
        });
    }
-3
votes

You can pass a parameter to an action helper :{{action "doSomething" xxx }}

Where doSomething is your controller method ,and xxx is anything in the current context of the template.