ajax之后的角度数据绑定

时间:2015-07-08 11:42:31

标签: javascript ajax angularjs data-binding

我的路线如下: /items/item/123/edit
和控制器(一个控制器用于查看和编辑):

...
if ($routeParams.id) {
          $scope.itemId = $routeParams.id;
          $scope.editMode = true;

          Item.getBoxes({id: $routeParams.id}).$promise.then(function (data) {
            $scope.data.boxId = [];

            angular.forEach(data, function (obj) {
              $scope.data.boxId.push(obj.id);
              $scope.boxCache[obj.id] = {id: obj.id, name: {id: obj.id, name: obj.name}};
            });

            $scope.items= data;
          });
        }
...
8个案例中的7个工作正常,但有时并未将数据绑定到视图。 我无法与$scope.$apply()$scope.$digest()合并,因为他们正在进行中

1 个答案:

答案 0 :(得分:2)

你可以使用$ scope。$仅在它们不在进行时才适用。

您可以通过检查$ scope。$$阶段来检查$ digest是否已在进行中。

if(!$scope.$$phase) {
  //$digest or $apply
}

使用安全申请,例如:

$rootScope.$$phase || $rootScope.$apply();

或其他方法使用此服务。

$timeout(function(),millisecond);

你也可以使用 - $evalAsync $ evalAsync([表达式],[本地人]);

看看这个 - > https://docs.angularjs.org/api/ng/type/$rootScope.Scope

$evalAsync$timeout之间选择取决于您的情况:

  • 如果代码使用指令中的$evalAsync排队,则应该运行 在DOM被Angular操纵之后,但在浏览器之前 渲染。
  • 如果代码使用来自控制器的$evalAsync排队,则应该运行 在DOM被Angular操纵之前(和之前) 浏览器渲染) - 很少你想要这个
  • 如果代码使用$timeout排队,它应该在Angular操纵DOM之后运行,并在浏览器渲染之后运行(在某些情况下可能会导致闪烁)