Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 防止多个ajax请求onclick_Javascript_Ajax_Angularjs_Q - Fatal编程技术网

Javascript 防止多个ajax请求onclick

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

我遇到了多个ajax请求的问题。例如,我有一个带有按钮的表单,
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请求更像是一个逻辑问题。。。多次发送此请求如何导致同一项多次插入到集合中?集合不应该简单地设置为结果,从而不可能包含重复项吗?为什么要将结果附加到集合中?不知道,您在问题中没有提供该代码。