0

我有这个用于分页的分叉代码plunker,它工作正常,但是在我进行一些调整以使其从 Json 文件中获取数据后,它停止工作。
要查看代码工作注释行:[13、14、15],然后取消注释行:[16 -> 37]。
该错误是关于 $filter 函数的问题,它在从 Json 文件中获取数据时返回 undefined 所以我认为因为该对象是一个承诺,现在破坏了 $filter 函数,我不确定。
错误发生在这 2 个函数中(使用 Json 调用):

$scope.search = function () {
  $scope.filteredItems = $filter('filter')($scope.items, function (item) {
    for(var attr in item) {
      if (searchMatch(item[attr], $scope.query)){
        return true;
      }
    }
    return false;
  });
  // take care of the sorting order
  if ($scope.sortingOrder !== '') {
    $scope.filteredItems = $filter('orderBy')($scope.filteredItems, $scope.sortingOrder, $scope.reverse);
  }
  $scope.currentPage = 0;
  // now group by pages
  $scope.groupToPages();
};
// calculate page in place
$scope.groupToPages = function () {
  $scope.pagedItems = [];
  for (var i = 0; i < $scope.filteredItems.length; i++) {
    if (i % $scope.itemsPerPage === 0) {
      $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)] = [ $scope.filteredItems[i] ];
    } else {
      $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)].push($scope.filteredItems[i]);
    }
  }
};

错误信息:

TypeError:无法
          在           新的 controllers.MainCtrl(controllers
          .
js:99:10)

任何帮助提前感谢。

4

1 回答 1

1

问题是过滤器在 $http 的承诺返回完成之前被调用,所以 items 对象是未定义的。
这个谷歌组帖子中提到的解决方案(在控制器中调用 $filter 的正确方法?)
我需要这样做:

Items.then(function(data) {
    $scope.items = data;
    //call $scope.search here, instead of calling it on line 100
    $scope.search();
});

所以plunker现在可以工作了。感谢 google AngularJS 小组中的 Florian Orben。

于 2013-03-08T20:11:13.213 回答