范式
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,按钮恢复启用状态。