AngularJS:如何知道angular何时刷新了视图中的所有绑定

AngularJS:如何知道angular何时刷新了视图中的所有绑定,angularjs,dom,Angularjs,Dom,在mainPage.html中,我们从一个对象名称中显示一个表 当用户单击next按钮时,将发送下一组名称的rest请求。单击“下一步”按钮后,我立即显示正在加载的图像。我只想在新数据集反映在表中之后隐藏加载图像。我如何知道angular是否已经用新的数据集更新完DOM?我假设您正在通过$http请求下一组名称。如果不是,则只要使用承诺,通常异步操作也适用相同的模式 通过以下步骤,一切都会在Angular运行时发生。显示/隐藏的数据点与名称同时更新,因此它们将在相同的摘要周期中更新,并在DOM上

在mainPage.html中,我们从一个对象名称中显示一个表


当用户单击next按钮时,将发送下一组名称的rest请求。单击“下一步”按钮后,我立即显示正在加载的图像。我只想在新数据集反映在表中之后隐藏加载图像。我如何知道angular是否已经用新的数据集更新完DOM?

我假设您正在通过$http请求下一组名称。如果不是,则只要使用承诺,通常异步操作也适用相同的模式

通过以下步骤,一切都会在Angular运行时发生。显示/隐藏的数据点与名称同时更新,因此它们将在相同的摘要周期中更新,并在DOM上同时呈现

一般来说,将所有内容保持在角度上,并将所有内容设置为不在视图中的$scope范围内,这样可以很容易地保持同步

.controller('tableController', function($http, $scope){
    $scope.loading = false;
    $scope.getSomeNames = function(){
       $scope.loading = true; 
       $http.get('names').then(function(reponse){
            $scope.loading = false;
            $scope.names = response.data
       })
    })

})
HTML:


我假设您正在通过$http请求下一组名称。如果不是,则只要使用承诺,通常异步操作也适用相同的模式

通过以下步骤,一切都会在Angular运行时发生。显示/隐藏的数据点与名称同时更新,因此它们将在相同的摘要周期中更新,并在DOM上同时呈现

一般来说,将所有内容保持在角度上,并将所有内容设置为不在视图中的$scope范围内,这样可以很容易地保持同步

.controller('tableController', function($http, $scope){
    $scope.loading = false;
    $scope.getSomeNames = function(){
       $scope.loading = true; 
       $http.get('names').then(function(reponse){
            $scope.loading = false;
            $scope.names = response.data
       })
    })

})
HTML:


我不确定这是否对你有帮助,但是有人创建了一个onNg repeatfinished处理程序,也许你可以将它应用于你的表,但我不确定

我不确定这是否对您有帮助,但有人创建了一个onNg repeatfinished处理程序,也许您可以将其应用于您的表,但我不确定
我同意Dylan Watt的观点,尽管我认为我希望使用$http的内置承诺,在出现问题时,成功和错误都会让处理更简洁

设置启用加载状态的var,进行ajax调用,在ajax调用成功时更改加载状态,或者在出现错误时执行其他操作

$scope.getFunction = function () {
  $scope.loading = true;
  $http.get('/someUrl').
    success(function(data, status, headers, config) {
      $scope.names = data;
      $scope.loading = false;
    }).
    error(function(data, status, headers, config) {
      // gracefully handle the error here
    });
}
如果上述方法不能解决您的问题,那么您需要考虑以下问题:


否如果您的响应中有1000行,那么时间 $http结束时,以及angular的摘要循环的时间 克服将会有一个明显的滞后。。。问题是什么 is-如何识别上一个摘要周期何时完成-entre

一个潜在的解决方案是,尽管我不认为这是一个好方法,但它应该与本文的思路类似:

并设置一个超时,在设置的时间段内等待直到没有DOM更改发生。我没有看到任何地方可以确定最后一个$digest周期具体发生的时间。在通过ng repeat对大量数据进行爆破的情况下,您应该看到DOM填充的爆发,然后它应该会安静下来

更好的解决方案似乎是使用“element ready”指令,该指令在加载$rootScope.loading=false后触发它,如下文所述:
我同意Dylan Watt的观点,尽管我认为我希望使用$http的内置承诺,在出现问题时,成功和错误都会让处理更简洁

设置启用加载状态的var,进行ajax调用,在ajax调用成功时更改加载状态,或者在出现错误时执行其他操作

$scope.getFunction = function () {
  $scope.loading = true;
  $http.get('/someUrl').
    success(function(data, status, headers, config) {
      $scope.names = data;
      $scope.loading = false;
    }).
    error(function(data, status, headers, config) {
      // gracefully handle the error here
    });
}
如果上述方法不能解决您的问题,那么您需要考虑以下问题:


否如果您的响应中有1000行,那么时间 $http结束时,以及angular的摘要循环的时间 克服将会有一个明显的滞后。。。问题是什么 is-如何识别上一个摘要周期何时完成-entre

一个潜在的解决方案是,尽管我不认为这是一个好方法,但它应该与本文的思路类似:

并设置一个超时,在设置的时间段内等待直到没有DOM更改发生。我没有看到任何地方可以确定最后一个$digest周期具体发生的时间。在通过ng repeat对大量数据进行爆破的情况下,您应该看到DOM填充的爆发,然后它应该会安静下来

更好的解决方案似乎是使用“element ready”指令,该指令在加载$rootScope.loading=false后触发它,如下文所述:

一旦$http调用结束,Angular将通过$apply触发摘要阶段。在该摘要阶段之后执行的任何代码都将在更新HTML之后执行

确保代码在摘要阶段之后执行的一种方法是使用setTimeout或$timeout。例如:

$http.get(url).success(function() {
  // Update the scope
  $scope.data = data;
  // Wait for the DOM to be up do date (end of digest cycle)
  $timeout(function() {
    // Here you can safely remove your loading things
  });
});
但是,如果图像本身是通过使用ng添加/删除的- 例如,show或ng,则不需要$timeout事件:在更新视图的同时,图像将从视图中隐藏。这将在相同的摘要周期中发生。

一旦$http调用结束,Angular将通过$apply触发摘要阶段。在该摘要阶段之后执行的任何代码都将在更新HTML之后执行

确保代码在摘要阶段之后执行的一种方法是使用setTimeout或$timeout。例如:

$http.get(url).success(function() {
  // Update the scope
  $scope.data = data;
  // Wait for the DOM to be up do date (end of digest cycle)
  $timeout(function() {
    // Here you can safely remove your loading things
  });
});

但是,如果图像本身是通过Angular使用ng show或ng if添加/删除的,那么您不需要$timeout事件:图像将在视图更新的同时从视图中隐藏。这将在同一个摘要周期内发生。

您可以截取$http但不加载部件您可以截取$http但不加载部件回答不正确我只想在新数据集反映在表中后隐藏加载映像,它不在$http端,而是在刷新页上$scope.loading=false;应该始终处于最终状态,但由于图像标志和数据更新同时发生,DOM将同时使用两个数据点进行更新,因此加载指示器无法在数据显示之前消失。此外,是否希望加载指示器在出现错误时消失是首选项。页面刷新?什么时候有页面刷新?没有如果您的响应中有1000行,那么$http完成的时间,以及angular的摘要周期结束的时间。。将会有一个明显的滞后。。。问题是-如何识别上一个摘要周期何时结束?答案不对,我只想在新的数据集反映在表中后隐藏加载图像,而不是在$http end,而是在页面刷新$scope.loading=false;应该始终处于最终状态,但由于图像标志和数据更新同时发生,DOM将同时使用两个数据点进行更新,因此加载指示器无法在数据显示之前消失。此外,是否希望加载指示器在出现错误时消失是首选项。页面刷新?什么时候有页面刷新?没有如果您的响应中有1000行,那么$http完成的时间,以及angular的摘要周期结束的时间。。将会有一个明显的滞后。。。问题是——如何识别最后一个摘要周期何时结束我通常避免使用内置的成功与错误方法,因为这样很难将逻辑移植到另一个数据源。例如,如果它来自websockets,您必须重写服务,如果您使用标准promise,您可以只交换一个调用。当然,这是一个偏好问题。我通常避免使用内置的success&error方法,因为这样很难将逻辑移植到另一个数据源。例如,如果它来自websockets,您必须重写服务,如果您使用标准promise,您可以只交换一个调用。“当然是偏好的问题。”弗洛里本我又找到了这个问题的一个答案。你能看出哪一个是表演家吗@DivyaMV我已经看到了这个答案,老实说,我不理解这个答案的必要性。ng repeat将同时编译所有项,而不是一个接一个地进行刷新。它发生在同一个摘要周期中,所以$timeout就足够了,不需要额外的指令。关于性能,它们应该具有相同的性能,或者一个简单的$timeout(如我的回答中所述)会快一点,因为您避免了指令编译/链接阶段+事件发射。@floribbon我又找到了一个问题的答案。您能看到哪一个是性能测试吗@DivyaMV我已经看到了这个答案,老实说,我不理解这个答案的必要性。ng repeat将同时编译所有项,而不是一个接一个地进行刷新。它发生在同一个摘要周期中,所以$timeout就足够了,不需要额外的指令。关于性能,它们应该具有相同的性能,或者像我的回答中那样的简单$timeout会快一点,因为您避免了指令编译/链接阶段+事件发射。