【问题标题】:AngularJs ng-repeat of objects orderBy object-id in arrayAngularJs ng-repeat 对象 orderBy 数组中的对象 ID
【发布时间】:2015-09-07 08:48:09
【问题描述】:

我想通过他的特定对象“id”来订购对象ng-repeat 的结果。这个订单在一个数组中,所以我制作了这个自定义过滤器ng-repeat="line in dataObject|objectIdFilter:orderByArray"

.filter('objectIdFilter', [function() {
    return function(inputObjet, orderArray) {
        var result = [];
        angular.forEach(orderArray, function(value) {
          result.push(inputObjet[value]);
        });
        console.log(result);
        return result;
    }
}])

这是一个基本控制器示例,其中包含对象和数组中的订单 ID:

.controller('MainCtrl', ['$scope', function($scope) {

  $scope.dataObject = {
    1: {username:'user1'},
    10: {username:'user10'},
    20: {username:'user20'},
    500: {username:'user500'}
  };

  $scope.orderByArray = [20,10,1,500];

}])

用他的 HTML:

<div ng-app="myApp">
  <div ng-controller="MainCtrl">
      <div ng-repeat="line in dataObject|objectIdFilter:orderByArray">{{line.username}}</div>
  </div>
</div>

Jsfiddle:https://jsfiddle.net/infnadanada/tLrx4uro/

所以...

  • 一切正常,但我不知道是否有其他方法可以像我在不使用自定义过滤器的情况下那样订购 ng-repeat。

  • 如果您在浏览器控制台中转到 Jsfiddle,您可以看到我的自定义过滤器如何返回 2 倍的结果,我不知道为什么。

PD:英语不是我的第一语言:D

谢谢

【问题讨论】:

  • @intekhab 是针对 datbinding 问题? apply's diggest's..?所以这是一个angularjs原生问题?我可以做点什么来解决这个问题吗?
  • 我会在控制器中创建 js 函数来执行与您的过滤器“objectIdFilter”相同的操作,并调用它一次,因为每次您对集合进行操作时都会调用过滤器。
  • 好的,我明白了。你们是对的,我可以这样做并清除html模板代码。

标签: javascript angularjs filter ng-repeat


【解决方案1】:

可能还有另一种好方法,但您可以在不使用过滤器的情况下过滤控制器内的数据。通过使用它,您可以防止 Angular 两次调用过滤器。

$scope.dataObject = {
    1: {username:'user1'},
    10: {username:'user10'},
    20: {username:'user20'},
    500: {username:'user500'}
  };
  $scope.orderByArray = [20,10,1,500];
   $scope.result = [];
  angular.forEach($scope.orderByArray, function(value) {
      $scope.result.push($scope.dataObject[value]);
  });
}]);

模板内部

<div ng-app="myApp">
  <div ng-controller="MainCtrl">
      <div ng-repeat="line in result">{{line.username}}</div>
  </div>
</div>

【讨论】:

    【解决方案2】:

    其他方式:可以遍历map:https://jsfiddle.net/sherali/tLrx4uro/2/

    $scope.dataObject = {
        1: {username:'user1'},
        10: {username:'user10'},
        20: {username:'user20'},
        500: {username:'user500'}
      };
      $scope.orderByArray = [20,10,1,500];
      $scope.result = $scope.orderByArray.map(function(value){
          return $scope.dataObject[value];
      });
    

    【讨论】:

    • 这是一个有效的答案,但我搜索了一些可以更好的答案,我发现jsperf.com/map-foreach 我不知道这对angular.forEach 是否有效,我会进行更多调查:D 谢谢
    • @nada。感谢上面的链接。我不知道
    • 另外,我在 foreach(角度和原生)上面进行了研究。我发现:jsperf.com/angular-foreach-vs-native-for-loop/3
    • angular.forEach(arr...)arr.forEach(...)
    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多