Javascript AngularJS ng重复生成选项卡

Javascript AngularJS ng重复生成选项卡,javascript,angularjs,twitter-bootstrap,Javascript,Angularjs,Twitter Bootstrap,在这种情况下,可以创建动态数量的选项卡(即,用户单击命令菜单中的一个条目,并将一个新的pill选项卡对添加到已经存在的选项卡上-注意:我正在使用图形元素的引导) 选项卡列表在$rootScope数组中管理,每当需要打开新选项卡时,就会向数组中添加一个条目(简单的推送操作)。当然,有一个ng repeat来处理实际创建的药丸标签对 这非常有效(添加了选项卡和药丸,但我无法将新选项卡设置为活动选项卡,因为它的创建(即添加到列表中)发生在控制器中,并且DOM仍然不知道该元素 我想设置某种计时器,但这条

在这种情况下,可以创建动态数量的选项卡(即,用户单击命令菜单中的一个条目,并将一个新的pill选项卡对添加到已经存在的选项卡上-注意:我正在使用图形元素的引导)

选项卡列表在$rootScope数组中管理,每当需要打开新选项卡时,就会向数组中添加一个条目(简单的
推送
操作)。当然,有一个
ng repeat
来处理实际创建的药丸标签对

这非常有效(添加了选项卡和药丸,但我无法将新选项卡设置为活动选项卡,因为它的创建(即添加到列表中)发生在控制器中,并且DOM仍然不知道该元素


我想设置某种计时器,但这条路径非常难看。

在angular中可以使用$timeout服务:

$timeout

例如,如果在呈现指令并初始化控制器后需要执行某些步骤,则只需在控制器代码末尾添加:

$timeout(function(){ $scope.steps_to_do(); } );
这将在组件的摘要循环完成后触发步骤

此外,在单元测试中,您确实可以很好地控制它

因此,一种可能的方法是:

  • 在添加新选项卡之前,请在某个父范围或服务中创建承诺
  • 创建子控制器后,在该子控制器中添加$timeout的承诺解析

    • 不要使用超时或类似的方法,因为你永远不知道加载它需要多长时间。 我建议您在ng repeat上使用此指令:

      .directive('onFinishRender', function ($rootScope) {
              return {
                  restrict: 'A',
                  link: function (scope, element, attr) {
                      if (scope.$last) {
                          $rootScope.$broadcast("ngRepeatFinished");
                      }
                  }
              };
          });
      
      HTML:

      <ul>
         <li class="pages" data-ng-repeat="page in sidebarPages" on-finish-render></li>
      </ul>
      
      你也可以试试


      你的代码在哪里?你在使用它吗?我可以添加代码,但它不会添加任何细节。这是一个时间问题(即元素被渲染,只有在渲染之后才能访问它以将类设置为活动,但当元素添加到控制器内的数组中时,DOM仍然不知道该元素).根据bootstrap.ui,不,我没有使用它。我建议你看看我的链接,这是一个原生的angularjs引导实现,可以让你的生活更轻松。谢谢@AlonEitan。我以前见过(只是看了一下,事情又回到了我的内存堆栈前面)我会考虑把这些库添加到我需要做的其他事情上。但是,我不太清楚这将如何解决我的时序问题。无论如何,谢谢。不错的方法,虽然我会使用<代码> $ESPIT <代码>而不是<代码> $广播<代码>。试试看,谢谢。还没试过。别担心。一旦我尝试,我会让你知道(如果它解决了我的问题,我会投票)。我只是好奇:)但它在过去对我有效,所以应该没问题:)我知道好奇是什么,不会让你失望。别担心。干杯嗯@TSlegaitis,我很遗憾地通知您,您的解决方案对我不起作用。我确实按照预期触发并捕获了事件,但DOM仍然不知道该元素。
      $rootScope.$on('ngRepeatFinished', function(event, args) {
      
          // do what you want to do
      });
      
      $scope.$on('$viewContentLoaded', function(event, args) {
      
          // do what you want to do
      });