最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to pass parameters with the action Helper of Ember.js inside an input field from an Handlebars template? - Stac

programmeradmin3浏览0评论

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?

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?

Share Improve this question edited Dec 24, 2016 at 14:13 Marcio Junior 19.1k4 gold badges46 silver badges47 bronze badges asked Sep 12, 2013 at 11:18 Massimo GuidiMassimo Guidi 1501 gold badge1 silver badge8 bronze badges 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 Commented Sep 12, 2013 at 17:29
  • The default is that the action is invoked on enter. – user663031 Commented Nov 28, 2013 at 7:59
  • 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. Commented Apr 6, 2016 at 9:13
  • This is now possible - see my answer below – andorov Commented Sep 3, 2016 at 23:15
Add a comment  | 

4 Answers 4

Reset to default 10

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

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

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();
            });
        });
    }

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.

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论