我正在试图找出阻止多次点击按钮的惯用方法。
想象一下,我有一个简单的控制器动作......
var FooController = Ember.ObjectController.extend({
actions: {
go: function() {
console.log("done!");
}
}
});
在我的模板中,我有一个如此定义的按钮......
<button {{action go}}>Click Me Fast</button>
操作是否有一个选项可以立即禁用它/只有一次真正的事件将由控制器处理(例如,直到它被禁用)
修改
我正在寻找一个长期/多用途的解决方案。我正在考虑的一个想法是创建一个名为“按钮禁用”的特殊余烬组件,这将允许我创建一个自定义按钮类型,通常在单击后禁用 - 但仍然允许我将事件冒泡到父母控制器。如果存在另一个选项,或者如果有人为此创建了一个插件,请感觉重量比我想要的重一点 - 让我知道
答案 0 :(得分:8)
作为一次性,如果您按下按钮上的禁用属性
<button {{action go}} {{bind-attr disabled=actionPerformed}}>
然后将控制器设置为
var FooController = Ember.ObjectController.extend({
actionPerformed: false,
actions: {
go: function() {
this.set("actionPerformed", true);
console.log("done!");
}
}
});
然后单击一次后该按钮将被禁用
如果你想要一个可重复使用的组件,我会从http://emberjs.com/guides/cookbook/helpers_and_components/spin_button_for_asynchronous_actions/借用微调按钮并根据需要进行调整。
所以你的JS就是
window.SpinEg = Ember.Application.create({});
SpinEg.ApplicationController = Ember.Controller.extend({
isLoading:false,
buttonText:"Submit",
actions:{
saveData:function(){
var self = this;
var saveTime = Ember.run.later(function(){
self.set('isLoading', false);
}, 1000);
}
}
});
SpinEg.SpinButtonComponent = Ember.Component.extend({
classNames: ['button'],
buttonText:"Save",
isLoading:false,
actions:{
showLoading:function(){
if(!this.get('isLoading')){
this.set('isLoading', true);
this.sendAction('action');
}
}
}
});
您的组件的模板将是
<script type='text/x-handlebars' id='components/spin-button'>
<button {{bind-attr id=id}} {{action 'showLoading'}}>
{{#if isLoading}}
<img src="http://i639.photobucket.com/albums/uu116/pksjce/spiffygif_18x18.gif"></img>
{{else}}
{{buttonText}}
{{/if}}
</button>
</script>
然后您只需在需要按钮的位置包含以下内容
<script type='text/x-handlebars' id='application'>
{{spin-button id="forapplication" isLoading = isLoading buttonText=buttonText action='saveData'}}
</script>