完成后,angularjs嵌套的ng-repeat函数调用

时间:2016-11-07 10:23:47

标签: javascript angularjs

我有2个嵌套的ng-repeat和boolean,这将隐藏加载div,但是在渲染所有内容之前加载div是隐藏的。 Boolean取决于获取所有数据的回调函数。

<tr ng-repeat="package in packages track by $index">
   <td> {{ pack.Name }}</td>
   <td>
      <select ng-hide="package.spinStart" class="form-control" ng-model="package.selectedVersion">
            <option ng-repeat="pack in package.allPackageVersions track by $index"
                    value="{{pack.Version}}"
                    ng-hide="pack.shouldHide"
                    ng-disabled="!expertModeOn && pack.shouldDissable"
                    ng-style="!expertModeOn && pack.shouldDissable && {'color':'#ddd'}">

                    {{pack.NuGetPackageId}} | {{pack.Version}} | {{pack.Published}}
            </option>
      </select>

当所有2个嵌套循环完成后,我如何调用该函数?

我尝试使用$watch语句和directive。 谢谢你!

2 个答案:

答案 0 :(得分:3)

你能用$ last吗?

<!DOCTYPE html>
<html data-ng-app="myApp">

<head>
  <link rel="stylesheet" href="style.css">
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
  <script src="script.js"></script>
</head>

<body data-ng-controller="testController">


  <div ng-repeat="package in packages">
    {{package.name}}
    <div ng-repeat=" pkg in package.selectedVersion" ng-init="$last && call()">
      {{pkg.name}}
    </div>
  </div>

  <script>
    angular
      .module('myApp', [])
      .run(function($rootScope) {
        $rootScope.title = 'myTest Page';
      })
      .controller('testController', ['$scope',
        function($scope) {
          $scope.packages = [{
            name: 'test1',
            selectedVersion: [{
              name: 'test_ver1'
            }, {
              name: 'test_ver2'
            }, {
              name: 'test_ver3'
            }]
          }, {
            name: 'test2',
            selectedVersion: [{
              name: 'test_ver1'
            }, {
              name: 'test_ver2'
            }, {
              name: 'test_ver3'
            }]
          }];

          var counter = 0
          $scope.call = function() {
            counter++
            if (counter == $scope.packages.length) {
              alert("All loops finished");
            }
          }
        }
      ])
  </script>
</body>

</html>

答案 1 :(得分:1)

您可以使用在外部循环结束时发出事件的指令 您可以在任何循环中重用此指令,只需重新订阅该事件。

app.directive('onRepeatFinish', function($timeout) {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            // $last is a boolean set by angular inside ng-repeats
            if (scope.$last) {
                // Wait for view to fully render
                $timeout(function() {
                    // Emit upwards the tree
                    scope.$emit('repeatFinished');
                });
            }
        }
    };
});

在您的控制器中,订阅该活动:

$scope.$on('repeatFinished', function() {
    $scope.showLoader = false;
});

视图中的用法:

<tr ng-repeat="package in packages track by $index" on-repeat-finish>