【问题标题】:Prevent button click while digest cycle is running in angular摘要循环以角度运行时防止按钮单击
【发布时间】:2016-08-30 11:29:19
【问题描述】:

我正在通过单击按钮更新 $scope,这基本上是进行 Restangular 调用、获取数据并填充 $scope 变量。

但是,如果用户在 $digest 循环运行时多次单击该按钮,则 $scope 会更新为重复值。

我很确定这是一个常见问题。但是,我在 SO 上还没有遇到我正在寻找的解决方案。

人们建议使用$timeout,但这似乎不合逻辑。

我宁愿在$digest 循环运行时禁用该按钮。

这是我目前实现的。

$scope.names = [];
$scope.disableButton = true;
FetchNames.getAllNames().then(function(result){
  result.data.forEach(function(name){
    $scope.names.push(name);
  });
$scope.disableButton = false;
});

在这里,当 promise 得到解决时,按钮被禁用。 但这并不能解决我的问题。我需要检查摘要周期何时完成。

【问题讨论】:

  • 我认为这对你很有用stackoverflow.com/questions/21138388/…
  • 我不明白为什么 $timeout 应该是“反逻辑”的,因为它在触发回调之前等待摘要周期完成。
  • cbass,它不会再运行摘要循环吗?

标签: javascript angularjs


【解决方案1】:

试试这个:

$scope.names = [];
$scope.disableButton = true;
FetchNames.getAllNames().then(function(result){
  // if in digest; reuturn
  if($scope.$$phase || $scope.$root.$$phase ){return}
  result.data.forEach(function(name){
    $scope.names.push(name);
  });
$scope.disableButton = false;
});

【讨论】:

    【解决方案2】:
    【解决方案3】:

    当用户点击按钮时,使用 ng-disabled 内置指令禁用按钮。要实现这一点,只需将变量设置为 true。看下面的代码

    <button ng-click="btn1=true, yourFunction()" ng-disabled='btn1'>
    

    在你的控制器中可以是这样的

        $scope.btn1= false;
        $scope.yourFunction= function(){
          $scope.names = [];
          FetchNames.getAllNames().then(function(result){
            result.data.forEach(function(name){
              $scope.names.push(name);
           });
           $scope.disableButton = false;
         };
    

    【讨论】:

    • 这并不能解决摘要循环再次启动的问题。
    • 我发现这个link 对您的摘要周期很有用。希望它对你有用!
    • 如果你喜欢,可以请你删除反对票和赞成票吗?
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多