如何在ng Repeat上完成渲染时如何判断

时间:2015-03-09 01:50:57

标签: angularjs angularjs-ng-repeat

我正在研究使用selenium webdriver测试的大型Angular应用程序。我担心的是,抄本需要时间,而且我需要反馈,以便在转录完成时通知我。这将允许我等到触发器触发以获取其他信息。有没有办法做到这一点?在加载完所有内容后,ng-repeat-end之类的内容会被处理吗?

3 个答案:

答案 0 :(得分:1)

无法判断DOM是否已完全呈现,但是当最后一个元素被$编译并使用简单指令添加到DOM时,您可以触发事件:

.directive('last', function() {
    return {
        link: function(scope) {
            if(scope.$last) {
                $scope.emit('ngRepeat.finished');
                //or really anything you want to do
            }
        }
     }
});

用法:

<div ng-repeat="item in items" last>

需要注意的是,如果&#34; items&#34;如果更改,则重建ng-repeat,这样您就可以获得另一个事件。

答案 1 :(得分:1)

我不清楚你是否想在ng-repeat之后得到一个事件,或者你只是想等到你可以保证它已经完成。

这是等待在jQuery和$ http中加载的驱动程序等待,结合角度的摘要/渲染周期(如果你不需要,你可以删除与摘要/渲染无关的部分) 。它包含在一个注释示例中,说明如何将其插入到C#selenium驱动程序调用中,该调用应转换为您使用的任何语言。

/*var pageLoadWait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(timeout));
            pageLoadWait.Until<bool>(
                (driver) =>
                {
                    return (bool)JS.ExecuteScript(
@"*/
try {
  if (document.readyState !== 'complete') {
    return false; // Page not loaded yet
  }
  if (window.jQuery) {
    if (window.jQuery.active) {
      return false;
    } else if (window.jQuery.ajax && window.jQuery.ajax.active) {
      return false;
    }
  }
  if (window.angular) {
    if (!window.qa) {
      // Used to track the render cycle finish after loading is complete
      window.qa = {
        doneRendering: false
      };
    }
    // Get the angular injector for this app (change element if necessary)
    var injector = window.angular.element('body').injector();
    // Store providers to use for these checks
    var $rootScope = injector.get('$rootScope');
    var $http = injector.get('$http');
    var $timeout = injector.get('$timeout');
    // Check if digest
    if ($rootScope.$$phase === '$apply' || $rootScope.$$phase === '$digest' || $http.pendingRequests.length !== 0 || $rootScope.$$applyAsyncQueue.length > 0) {
      window.qa.doneRendering = false;
      return false; // Angular digesting or loading data
    }
    if (!window.qa.doneRendering) {
      // Set timeout to mark angular rendering as finished
      $timeout(function() {
        window.qa.doneRendering = true;
      }, 0);
      return false;
    }
  }
  return true;
} catch (ex) {
  return false;
}
/*");
                });*/

编辑:在Jackie的评论之后,我注意到某些页面没有完全渲染的情况,添加|| $rootScope.$$applyAsyncQueue.length > 0似乎已经解决了这个问题。

答案 2 :(得分:0)

我认为上面的答案很好,但我认为这里的重点是即使ng-repeat指令隔离范围,它也有一个范围变量,它会告诉你它是否是最后一个。如果你正在角度方面发射一个事件或某事,那么之前的答案可能是最好的想法。但是,如果你的动机纯粹是基于测试的(就像我的那样),那就够了......

ng-class="{'last': $last}"