范式
1 | let isProcessing = false; |
方案一
angularjs 能不能实现一个组件,放到所有的按钮上面,控制ng-click防重复提交策略
在 AngularJS 中,可以通过创建一个自定义指令来实现一个通用的防重复点击组件,这个指令可以附加到任何按钮上,以控制 ng-click
的防重复提交策略。
以下是一个完整的示例:
1. 创建防重复点击指令
1 | // 增加按钮防重复点击组件 |
2. 使用自定义指令
在 HTML 中,将 prevent-repeated-click
指令附加到按钮上,并可选地指定 click-delay
属性来设置按钮禁用的时间(以毫秒为单位)。
1 |
|
3. 控制器逻辑
在控制器中定义按钮的点击处理函数。
1 | app.controller('myCtrl', function ($scope) { |
解释
- **自定义指令
preventRepeatedClick
**:- **
restrict: 'A'
**:指定该指令为属性类型。 - **
scope
**:定义指令的隔离作用域,ngClick
用于绑定按钮的点击事件,clickDelay
用于设置按钮禁用的时间。 link
函数:在指令的链接函数中,监听按钮的点击事件。- **
isProcessing
**:标记按钮是否正在处理事件。 - **
delay
**:从click-delay
属性获取按钮禁用的时间,如果没有指定则使用默认值 2000 毫秒。 - 禁用按钮:在点击事件发生时,如果
isProcessing
为true
,阻止事件的默认行为并返回,防止重复点击。否则,将isProcessing
设置为true
并禁用按钮。 - **触发
ng-click
**:调用绑定的ngClick
函数。 - 延迟启用按钮:使用
$timeout
在指定的延迟时间后将isProcessing
设置为false
并启用按钮。
- **
- **
- 使用指令:
- 在按钮上添加
prevent-repeated-click
指令,并可选地使用click-delay
属性来指定按钮禁用的时间。 - 绑定
ng-click
到按钮的点击处理函数。
- 在按钮上添加
- 控制器逻辑:
- 定义按钮的点击处理函数
buttonClick
,在其中执行相关的业务逻辑。
- 定义按钮的点击处理函数
通过这种方式,你可以将 prevent-repeated-click
指令附加到任何按钮上,以实现防重复点击的功能,而无需在每个按钮的控制器中重复编写相同的逻辑。
方案二
AngularJS 的双向数据绑定来实现。以下是一个示例:
- HTML 部分:使用
ng-disabled
指令来绑定按钮的禁用状态。 - JavaScript 部分:在控制器中定义一个变量来控制按钮的禁用状态,并在事件处理函数中修改这个变量。
HTML
1 | <div ng-app="myApp"> |
JavaScript
1 | var app = angular.module('myApp', []); |
在这个示例中,我们使用了 ng-disabled
指令来绑定按钮的禁用状态到 $scope.isDisabled
变量。当点击按钮时,buttonClick
函数会被调用,它会切换 $scope.isDisabled
的值,从而改变按钮的禁用状态。
- 初始状态下,
$scope.isDisabled
为false
,按钮是启用状态。 - 当按钮被点击时,
buttonClick
函数将$scope.isDisabled
设置为true
,按钮变为禁用状态。 - 再次点击按钮时,
buttonClick
函数将$scope.isDisabled
设置为false
,按钮恢复启用状态。