Javascript 如何使用Ember.js的动作助手传递参数?
我有一个项目清单:Javascript 如何使用Ember.js的动作助手传递参数?,javascript,ember.js,handlebars.js,Javascript,Ember.js,Handlebars.js,我有一个项目清单: <ul> {{#each applications}} <li> <a {{bindAttr href="url"}} {{action "appClicked" on="click"}}> {{name}} </a> </li> {{/each}} </ul&
<ul>
{{#each applications}}
<li>
<a {{bindAttr href="url"}}
{{action "appClicked" on="click"}}>
{{name}}
</a>
</li>
{{/each}}
</ul>
{{{#每个应用程序}
-
{{/每个}}
单击时,它调用此模板所属视图的方法appClicked
。我想将一些信息(例如,应用程序的名称)传递给方法appClicked
。类似于,{{action“appClicked(name)”on=“click”}
是否可能,以及如何实现?您可以尝试将参数设置为
我一直在想一些与此相关的东西,因为您可以通过实际视图访问更多内容。但是扎克,如果你能解释一下,如果这不是你想要的,你到底想做什么
App=Ember.Application.create();
App.peopleController=Ember.ArrayController.create({
内容:[{name:'Roy',url:'#'},
{姓名:'迈克',网址:'#'},
{姓名:'露西',网址:'#'}]
});
App.PersonView=Ember.View.extend({
标记名:“li”,
内容:空,
linkClicked:function(){
log(this.getPath('content.name');
}
});代码>
{{{#每个App.peopleController}
{{{#view App.PersonView contentBinding=“this”}
{{/view}
{{/每个}}
从子视图中,您可以附加数据属性并在控制器中访问它们
例如,在您的视图中,如果您有:
{{#view Ember.Button target="App.controller" action="publish" data-publish=false}}Unpublish{{/view}}
然后在控制器中
App.controller = Ember.Object.extend({
publish: function(v){
var status = v['data-publish'];//your additional information is appended to the view.
}
}
Veeb答案的一个改进是,记住您有jQuery事件,因此您可以执行以下操作:
// template
<ul>
{{#each applications}}
<li>
<a {{bindAttr href="url"}} param="abc" {{action "appClicked" on="click"}}>
{{name}}
</a>
</li>
{{/each}}
</ul>
// In your js code
appClicked: function (event) {
var param = $(event.target).attr('param');
...
}
//模板
{{{#每个应用程序}
-
{{/每个}}
//在js代码中
appClicked:函数(事件){
var param=$(event.target).attr('param');
...
}
显然,余烬现在已经进化,可以将参数传递给动作:
{{action "functionName" parameter}}
在您的情况下,这将是:
<a {{bindAttr href="url"}}
{{action "appClicked" name on='click'}}>
{{name}}
</a>
但是,您可以传递模型中的任何属性(如id),而不是名称
有关更多信息,请参阅。您可以传入多个参数
html和把手:
{{officename}}
<button {{action "actionTest" "hello" "goodbye" officename}}>See parameters through action in the console</button>
目前还没有一种方法可以做你想做的事情,我认为这样做听起来不太正确。我知道这只是您尝试执行的任何操作的一小部分,但您不需要将name
属性(或任何相关属性)传递给您的操作。目标应该是列表中的当前视图。你能提供一个JSFIDLE,也许再解释一下你想解决什么问题吗?这里可以从我看到的解决方案的API中找到答案,在某处(由Katz回答)。据我所知,您必须为要跟踪事件的每个元素(单击、焦点等)创建单独的视图。我说得对吗?我也发现了这个拉力,不确定这是否是我要找的。我也解释了一下,是的,你是对的。使用常规视图呈现非常大的列表时存在一些性能问题(我认为这是#collection helper被贬低的原因之一)。但是,如果您看看我的解决方案,我会将子视图更改为变态视图,这几乎消除了#collection和#each helpers之间的性能差异。无论如何,这是你应该做的。我不会太担心这个pull-req,我已经在这个答案中创建了一个JSFIDLE版本,它兼容Ember 1.0并且是惯用的。Roy,请随时使用此链接更新您的答案:从Ember 1.0版本开始,此JSBin不再运行。您可能需要更新它@HaoQu Li
{{officename}}
<button {{action "actionTest" "hello" "goodbye" officename}}>See parameters through action in the console</button>
actionTest: function(a, b, c){
console.log(a);
console.log(b);
console.log(c);
},