【问题标题】:Sorting an array of objects based on a property in an Angular controller using $filter使用 $filter 根据 Angular 控制器中的属性对对象数组进行排序
【发布时间】:2015-11-13 00:02:39
【问题描述】:

我有一个名为 $scope.segments 的对象数组,如下所示:

[
  {
    "_id": "55d1167655745c8d3679cdb5",
    "job_id": "55d0a6feab0332116d74b253",
    "status": "available",
    "sequence": 1,
    "body_original": "Such a fork",
    "__v": 0,
    "body_translated": "Tal bifurcación"
  },
  {
    "_id": "55d1167655745c8d3679cdb4",
    "job_id": "55d0a6feab0332116d74b253",
    "status": "available",
    "sequence": 0,
    "body_original": "So this is it.",
    "__v": 0,
    "body_translated": "Así que esto es."
  }
]

我需要按顺序按数组排序。所以,我需要先出现序列 0,然后出现序列 1,依此类推。在一个视图中,我正在这样做并且它有效:

<ul ng-repeat="segment in segments | orderBy: 'sequence'">
    <li>{{ segment.sequence }}</li>
</u>

但是,我需要 orderBy 过滤器才能在控制器中工作。我正在这样做:

$scope.test = $filter('orderBy')($scope.segments, 'sequence');

其中,$scope.test 应该是我基于序列属性的有序对象数组。但是,当我执行 console.log('$scope.test') 时,会显示一个空数组 ([])。我想 $filter 在控制器中不起作用。

关于如何解决这个问题的任何想法?谢谢!

【问题讨论】:

  • 打印时确保$scope.segments不为空,因为ng-repeat监听segments变化

标签: javascript arrays angularjs object


【解决方案1】:

您始终可以只对数组进行排序(然后您甚至可以在视图中省略 orderBy - 尽管如果添加任何内容,您会失去绑定的一些魔力):

$scope.segments.sort(function(a, b) {
    return a.sequence - b.sequence;
});

【讨论】:

  • 试过了但没用,很遗憾。这是我在main.js $scope.segments = SegmentsService.getSegments(jobId); // 从 API 获取分段 $scope.segments.sort(function(a, b) { return a.sequence - b.sequence; });控制台.log($scope.segments);在视图中,我有:&lt;pre&gt;{{ segments | json }}&lt;/pre&gt; 所以,我从 API 中获取了片段,并在视图中显示了片段 | json。排序完成后,排序后的对象会打印在控制台中。这是截图:imgur.com/UUBDpXq
  • 该 API 调用是异步的 - 因此在填充数组之前进行排序。
【解决方案2】:

我猜你只是没有在控制器中正确注入 $filter 服务,因为这对我有用。

<body ng-controller="MainCtrl">

  <ul ng-repeat="segment in segments | orderBy: 'sequence'">
    <li>{{segment.sequence}}</li>
  </ul>

  <script src="vendors/angular.min.js"></script>

  <script>
    angular.module('app', [])

    .controller('MainCtrl', ['$scope', '$filter', function($scope, $filter) {
      $scope.segments = [
      {
        "_id": "55d1167655745c8d3679cdb5",
        "job_id": "55d0a6feab0332116d74b253",
        "status": "available",
        "sequence": 1,
        "body_original": "Such a fork",
        "__v": 0,
        "body_translated": "Tal bifurcación"
      },
      {
        "_id": "55d1167655745c8d3679cdb4",
        "job_id": "55d0a6feab0332116d74b253",
        "status": "available",
        "sequence": 0,
        "body_original": "So this is it.",
        "__v": 0,
        "body_translated": "Así que esto es."
      }
    ];
      $scope.test = $filter('orderBy')($scope.segments, 'sequence');
      console.log($scope.test);
    }]);
  </script>

</body>

【讨论】:

  • 抱歉,这些对象来自对 API 的 $resource 调用。在视图中做 {{ 段 | json }} 美化对象。但是,做 console.log('$scope.segments');表明该对象是一个承诺。如何在这个包含对象的承诺中排序?
  • 通常情况下,promise 会在其中的某处包含模型数据。前任。 $scope.segments = injectedPromise.data[0];
【解决方案3】:

正如 tymeJV 所述,API 调用是异步的,因此问题是缺少数据来帮助回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2015-06-17
    • 2019-02-11
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多