【问题标题】:Trouble filtering angular-meteor collection with infinite-scroll support使用无限滚动支持过滤角流星集合时遇到问题
【发布时间】:2015-11-12 00:37:46
【问题描述】:

我正在尝试创建一个交互式照片数据库,用户可以在其中对照片进行排序并按用户过滤,检查他或她感兴趣的多个类别,并按日期、收藏夹数量等对过滤后的数据进行排序。过滤/排序标准由用户在 DOM 上选择,并从客户端存储到$scope.model。用户可见的数据量将通过无限滚动来控制。

我为此示例创建了repositoryI've deployed it here。我已经从下面的scroll.controller.js 中复制了一些相关代码:

代码

// infinite-scroll logic & collection subscription //
$scope.currentPage = 1;
$scope.perPage = 12;
$scope.orderProperty = '-1';
$scope.query = {};

$scope.images = $scope.$meteorCollection(function() {
  query={};            
  // if filtered by a user...
  if ($scope.getReactively('model.shotBy')) {
    query.shotBy = $scope.model.shotBy;
  };
  // if category filter(s) are selected...
  if ($scope.getReactively('model.category', true)) {
    if ($scope.model.category.length > 0){
      var categories = [];
      for (var i=0; i < $scope.model.category.length; i++){            
        categories.push($scope.model.category[i]);
      }
      query.category = {$in: categories};
    }
  };
  $scope.currentPage = 1; // reset
  return Images.find(query, { sort: $scope.getReactively('model.sort')});
});

$meteor.autorun($scope, function() {
  if ($scope.getReactively('images')){
    $scope.$emit('list:filtered');    
  }
});

$meteor.autorun($scope, function() {
  $scope.$meteorSubscribe('images', {
    limit: parseInt($scope.getReactively('perPage'))*parseInt(($scope.getReactively('currentPage'))),
    skip: 0,
    sort: $scope.getReactively('model.sort')
  });
});              

$scope.loadMore = function() {
  // console.log('loading more');
  $scope.currentPage += 1;
};  

问题

我可以很好地滚动图像,无限滚动功能似乎可以工作。但是,当我尝试从 DOM 过滤图像时,唯一过滤的结果是那些在滚动之前最初可见的结果,并且尽管使用了 $scope.$emit,但滚动不会使其余符合条件的图像显示向 ngInfiniteScroll 发出信号以加载更多内容 (documentation)。

编辑:如果初始过滤列表确实,事实上,到达底部,滚动将正确附加。似乎只有在初始过滤列表没有到达屏幕底部时才追加。

问题

我可以改变什么来让 ngInfiniteScroll 在过滤后的集合上表现得像我期望的那样?

如有任何帮助、想法或建议,我们将不胜感激,如果您还有什么想看的,请告诉我。谢谢!

【问题讨论】:

    标签: angularjs meteor angular-meteor nginfinitescroll


    【解决方案1】:

    好吧,几乎花了一整天的时间才弄清楚,但我现在在 this Github repository 有一个工作示例并部署了 here

    总而言之,我发现我需要在两个收集和订阅级别进行过滤,以使perPage 正确应用并让 ngInfiniteScroll 正常运行。此外,我需要通过$scope.$emit 向 ngInfiniteScroll 发送一个事件,告诉它再次触发,以防图像数组太小并且没有到达屏幕边缘。如果您有兴趣,请参阅 Github 存储库了解更多详细信息。

    更新了相关代码

    // infinite-scroll logic & collection subscription //
    $scope.currentPage = 1;
    $scope.perPage = 12;
    $scope.query = {};
    
    function getQuery(){
      query={};            
      // if filtered by a user...
      if ($scope.getReactively('model.shotBy')) {
        query.shotBy = $scope.model.shotBy;
      };
      // if category filter(s) are selected...
      if ($scope.getReactively('model.category', true)) {
        if ($scope.model.category.length > 0){
          var categories = [];
          for (var i=0; i < $scope.model.category.length; i++){            
            categories.push($scope.model.category[i]);
          }
          query.category = {$in: categories};
        }
      };
      return query;
    }
    
    $meteor.autorun($scope, function(){
      $scope.images = $scope.$meteorCollection(function() {
        $scope.currentPage = 1; // reset the length of returned images
        return Images.find(getQuery(), { sort: $scope.getReactively('model.sort')});
      });
      $scope.$emit('filtered'); // trigger infinite-scroll to load in case the height is too small 
    });
    
    $meteor.autorun($scope, function() {
      $scope.$meteorSubscribe('images', {
        limit: parseInt($scope.getReactively('perPage'))*parseInt(($scope.getReactively('currentPage'))),
        skip: 0,
        sort: $scope.getReactively('model.sort'),
        query: getQuery()
      });
    });              
    
    $scope.loadMore = function() {
      // console.log('loading more');
      $scope.currentPage += 1;
    };         
    

    我不确定我是否在此答案中使用了最佳做法,因此请随时提出建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2021-08-18
      相关资源
      最近更新 更多