【问题标题】:Angular - Infinite $digest LoopAngular - 无限 $digest 循环
【发布时间】:2017-03-08 15:11:51
【问题描述】:

我目前正在从事一个项目,我必须从一个视图中执行多个发布请求。我的问题是,我总是得到一个无限的 $digest 循环。这是我当前的代码:

js 文件:

$scope.foo = function(param) {
   var deffered = $q.defer();

   $http.post('ASDASD.php', {string : param})
     .then(function(data) {
       deffered.resolve(data);
       $scope.$apply();
    }
  );

  return deffered.promise;
};

$scope.bar = function(param) {
  $scope.foo(param).then(function(result) {
    return result;
  });
};

查看:

<div ng-controller='asdfCtrl'>
   {{bar('asdf')}}
    ...
   {{bar('jkl')}}
</div>

如您所见,我使用了 Promise、watcher 和 $scope.$apply,但仍然存在无限循环。

有没有办法确保函数 bar(和相应的 foo)只被调用一次?

提前致谢!

【问题讨论】:

  • 你的bar('asdf') 无论如何都不会显示任何东西——你没有从函数中返回任何东西。即使你确实返回了$scope.foo(param),你得到的只是你的$scope.foo() 返回的promise 对象。而且每次调用摘要循环时都发出http请求是没有意义的,这是很多请求。
  • 感谢您的回答。我找到了一种更有效的方法来解决这个问题!

标签: javascript angularjs infinite-loop angularjs-digest


【解决方案1】:

每次摘要循环运行时都发出请求是没有意义的。改为这样更改您的代码:

JS:

$scope.results = {};

$scope.bar = function(param) {
    $scope.foo(param).then(function(result) {
        $scope.results[param] = result;
    });
};

$scope.bar('asdf');
$scope.bar('jkl');

HTML:

<div>
    {{results['asdf']}}
    ...
    {{results['jkl']}}
</div>

此外,从您的 $scope.foo 函数中删除 $scope.$apply(),这是不需要的。

【讨论】:

  • 感谢您的回答。我找到了一种更有效的方法来解决这个问题!
  • @c_reil 介意分享“更高效”的方式吗?我遇到了和你一样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多