Javascript 防止多个ajax请求onclick
我遇到了多个ajax请求的问题。例如,我有一个带有按钮的表单,Javascript 防止多个ajax请求onclick,javascript,ajax,angularjs,q,Javascript,Ajax,Angularjs,Q,我遇到了多个ajax请求的问题。例如,我有一个带有按钮的表单,onclick它运行一个服务,基本上加载表中的项目列表;现在,当我按下按钮时,它应该将单个项目加载到表中 但是,当我多次按下按钮时,相同的项目在加载时会重复 当第一个仍然没有回调时,如何防止 当前ng服务 不确定这是否是一个解决方案,但当我编写上述代码时,如下所示: var def = false; var getItems = function () { def = $q.defer(); Items.get()
onclick
它运行一个服务,基本上加载表中的项目列表;现在,当我按下按钮时,它应该将单个项目加载到表中
但是,当我多次按下按钮时,相同的项目在加载时会重复
当第一个仍然没有回调时,如何防止
当前ng服务
不确定这是否是一个解决方案,但当我编写上述代码时,如下所示:
var def = false;
var getItems = function () {
def = $q.defer();
Items.get().then(function (items) {
def.resolve(items);
}, function (err) {
...
});
};
当我初始化
def=false
时,这将停止复制,通过将以前的/旧请求重置为false
,不确定这是否是正确的方法?您可以锁定该函数,以防止代码一次或一次运行多次:
// your service
$scope.isRunning = false;
var getItems = function () {
if(!$scope.isRunning){
$scope.isRunning = true;
var def = $q.defer();
Items.get().then(function (items) {
def.resolve(items);
}, function (err) {
...
}).finally(function(){
//$scope.isRunning = false; // once done, reset isRunning to allow to run again. If you want it to run just once then exclude this line
});
}
};
不确定要如何处理被多次单击的按钮
您可以在单击时将其隐藏:
<button ng-hide="isRunning">Stuff</button>
<button ng-disabled="isRunning">Stuff</button>
东西
您可以单击以下按钮将其禁用:
<button ng-hide="isRunning">Stuff</button>
<button ng-disabled="isRunning">Stuff</button>
东西
如果禁用,您可能应该提供反馈,如更改不透明度:
<button ng-disabled="isRunning" ng-class='{"opacity-half": isRunning}'>Stuff</button>
.opacity-half { opacity: 0.5 }
东西
.不透明度半{不透明度:0.5}
您可以锁定该函数,以防止代码一次或一次运行多次:
// your service
$scope.isRunning = false;
var getItems = function () {
if(!$scope.isRunning){
$scope.isRunning = true;
var def = $q.defer();
Items.get().then(function (items) {
def.resolve(items);
}, function (err) {
...
}).finally(function(){
//$scope.isRunning = false; // once done, reset isRunning to allow to run again. If you want it to run just once then exclude this line
});
}
};
不确定要如何处理被多次单击的按钮
您可以在单击时将其隐藏:
<button ng-hide="isRunning">Stuff</button>
<button ng-disabled="isRunning">Stuff</button>
东西
您可以单击以下按钮将其禁用:
<button ng-hide="isRunning">Stuff</button>
<button ng-disabled="isRunning">Stuff</button>
东西
如果禁用,您可能应该提供反馈,如更改不透明度:
<button ng-disabled="isRunning" ng-class='{"opacity-half": isRunning}'>Stuff</button>
.opacity-half { opacity: 0.5 }
东西
.不透明度半{不透明度:0.5}
下面的代码应该可以做到我正在避免的一些角度特定的语法,希望能有所帮助
function yourContoller(/*all injectables*/) {
var requesting = false;
$scope.buttonClick = function() {
if (!requesting) {
requesting = true;
yourService.getItems().then(function(response) {
/*your code to handle response*/
requesting = false;
});
}
};
}
如果您想禁用视图中的按钮,您可以通过使用scope(
$scope.requesting=false;
)和ng disabled
来公开此变量,下面的代码应该可以做到这一点,我正在避免一些特定角度的语法,希望对您有所帮助
function yourContoller(/*all injectables*/) {
var requesting = false;
$scope.buttonClick = function() {
if (!requesting) {
requesting = true;
yourService.getItems().then(function(response) {
/*your code to handle response*/
requesting = false;
});
}
};
}
如果要禁用视图中的按钮,只需在禁用了
的情况下使用scope($scope.requising=false;
)即可公开此变量,您可以创建一个可重复使用的指令,以便在任何可单击的按钮上,它不会被按下两次
app.directive('clickAndDisable', function() {
return {
scope: {
clickAndDisable: '&'
},
link: function(scope, iElement, iAttrs) {
iElement.bind('click', function() {
iElement.prop('disabled',true);
scope.clickAndDisable().finally(function() {
iElement.prop('disabled',false);
})
});
}
};
});
这可以在按钮上使用,如下所示:
<button click-and-disable="functionThatReturnsPromise()">Click me</button>
点击我
您可以创建一个可重复使用的指令,以便在任何可单击的按钮上,它不会被按下两次
app.directive('clickAndDisable', function() {
return {
scope: {
clickAndDisable: '&'
},
link: function(scope, iElement, iAttrs) {
iElement.bind('click', function() {
iElement.prop('disabled',true);
scope.clickAndDisable().finally(function() {
iElement.prop('disabled',false);
})
});
}
};
});
这可以在按钮上使用,如下所示:
<button click-and-disable="functionThatReturnsPromise()">Click me</button>
点击我
这不是问题的解决方案。这会进行同步调用,而不是异步操作要求取消前一个调用,而不是等待结果。@OnurTOPAL,这不会进行同步调用,angular不允许进行同步调用。这只是将函数限制为在调用中,直到它完成;类似但不同步。我不是指请求的同步(如在AJAX中),我是指异步请求的结果同步…@Simple Solution,问题是当多次单击函数时,您希望函数做什么?如果您希望它只运行一次,请让逻辑执行该操作。如果您希望在下一次调用之前限制它等待响应,请执行该操作。@简单的解决方案应该可以,但您也可以使按钮禁用或在控制器中保留一个变量以避免请求。这不是问题的解决方案。这会进行同步调用,而不是异步操作要求取消前一个调用,而不是等待结果。@OnurTOPAL,这不会进行同步调用,angular不允许进行同步调用。这只是将函数限制为在调用中,直到它完成;类似但不同步。我不是指请求的同步(如在AJAX中),我是指异步请求的结果同步…@Simple Solution,问题是当多次单击函数时,您希望函数做什么?如果您希望它只运行一次,请让逻辑执行该操作。如果您想限制它在下一次调用之前等待响应,请这样做。@简单的解决方案应该可以,但您也可以使按钮禁用或在控制器中保留一个变量以避免请求。这似乎比重复的ajax请求更像是一个逻辑问题。。。多次发送此请求如何导致同一项多次插入到集合中?集合不应该简单地设置为结果,从而不可能包含重复项吗?为什么要将结果附加到集合中?不知道,您在问题中没有提供该代码。这似乎比重复的ajax请求更像是一个逻辑问题。。。多次发送此请求如何导致同一项多次插入到集合中?集合不应该简单地设置为结果,从而不可能包含重复项吗?为什么要将结果附加到集合中?不知道,您在问题中没有提供该代码。