【问题标题】:How to prevent double clicks with ember.js?如何使用 ember.js 防止双击?
【发布时间】:2014-11-24 19:11:09
【问题描述】:

我正在尝试找出防止按钮被多次点击的惯用方法。

想象一下我有一个像这样的简单控制器动作......

var FooController = Ember.ObjectController.extend({
  actions: {
    go: function() {
        console.log("done!");
    }
  }
});

在我的模板中,我有一个这样定义的按钮...

<button {{action go}}>Click Me Fast</button>

该操作是否可以选择立即禁用它/使其只有在控制器处理真正的事件时才会处理(例如,直到它被禁用)

编辑

我正在寻找一种长期/多用途的解决方案。我正在考虑的一个想法是创建一个名为“button-disable”的特殊 ember 组件,这将允许我创建一个自定义按钮类型,该类型通常在单击后禁用 - 但仍然允许我将事件冒泡给父级控制器。这感觉比我想要的要重一些,所以如果存在其他选项,或者如果有人为此创建了插件 - 请告诉我

【问题讨论】:

标签: ember.js double-click


【解决方案1】:

一次性,如果你像这样在按钮上绑定 disabled 属性

<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>

【讨论】:

  • 正确 - 请参阅上面的编辑(我正在寻找一种可重用的解决方案,可以跨越大型项目中的许多按钮)
  • 啊,您在我发布的同时添加了您的编辑 :) 我已经编辑了我的答案,提到了 Ember 食谱中的微调器按钮组件。它基本上是你想要的,动作只会在“isLoading”属性为假时发送。
  • 将此解决方案包装到 Ember 组件中有什么问题?
  • 感谢详细的解释!
猜你喜欢
  • 2012-07-22
  • 2017-07-19
  • 2012-06-01
  • 2022-01-21
  • 2012-04-24
  • 2015-12-21
  • 2019-02-05
  • 2011-09-11
  • 2019-08-29
相关资源
最近更新 更多