【问题标题】:Error generating ng-repeat using a descending order filter使用降序过滤器生成 ng-repeat 时出错
【发布时间】:2017-08-27 06:54:40
【问题描述】:

我有一个对象,我尝试从最高到最低过滤数据并将其限制为 8。我收到这个错误,我不知道如何解决。发生了什么,我该如何解决?非常感谢您。

https://jsfiddle.net/bg3mkwvL/

  <div class="col-xs-3" ng-repeat='item in people | orderBy: "-score" | limitTo: 8'>
    <p>
      {{item.name}}  {{item.score}}
    </p>
  </div>

  $scope.people={ 
    "juan": { "name": "juan", "score":0},
    "pedro": { "name": "pedro", "score":0},
    "goku": { "name": "goku", "score":0},
  }

我需要使用这个语法:

"juan": {"name": "juan", "score": 0}

然后我需要写例如'

 console.log ($scope.people['juan'])  

我需要得到对象而不必循环。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您可以如下修改您的 json 对象数组;

    $scope.people= [
      { "name": "juan", "score":0},
      { "name": "pedro", "score":0},
      { "name": "goku", "score":0},
    ]
    

    【讨论】:

    • 但这就是我的答案的副本:(
    • 是的。我注意到...删除了我的答案。 ^1
    • @Dr.Geek 我需要使用这个语法: "juan": {"name": "juan", "score": 0} 然后我需要写例如 console.log ($ scope.people['juan']) 并且我需要获取对象而不必进行循环。
    • 如果你想使用这样的语法,你必须为这个特定的语法创建一个特定的管道模块。你可以阅读hashtagcoder.com/…docs.angularjs.org/api/ng/filter/orderBystackoverflow.com/questions/35176188/…
    • @Dr.Geek 我听不懂你,你能再给我解释一下好吗?
    【解决方案2】:

    您实际上需要将数据转换为逻辑方式来迭代数组。

    工作 Plnkr - http://plnkr.co/edit/obGuS8Cg28roOaNzrzfV?p=preview

    代码迭代-

    $scope.listData = $scope.people.map(function(data){
      var tmp = Object.keys(data);
      return data[tmp];
    })
    

    代码 -

    var app = angular.module('testApp', []);
    
    
    app.controller('testController', ['$scope', '$http', '$timeout', function($scope, $http, $timeout) {
          $scope.people= [
            {
              "juan": { "name": "juan", "score":8}
            },
            {
              "pedro": { "name": "pedro", "score":2}
            },
            {
              "goku": { "name": "goku", "score":7}
            },
          ];
          
          $scope.listData = $scope.people.map(function(data){
            var tmp = Object.keys(data);
            return data[tmp];
          })
    }]);
    <!DOCTYPE html>
    <html>
    
      <head>
        <script data-require="angular.js@1.6.1" data-semver="1.6.1" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
        <link rel="stylesheet" href="style.css" />
        <script src="script.js"></script>
      </head>
    
      <body>
        <div ng-app="testApp" ng-controller="testController">
     <div class="container">
        <div class="row">
          <div class="col-xs-3" ng-repeat='data in listData | orderBy: "-score"'>
            <p>
              {{data.name}}  {{data.score}}
            </p>
          </div>
        </div>
      </div>
    </div>
    
      </body>
    
    </html>

    【讨论】:

    • 太棒了!谢谢,但我需要使用以下语法:“juan”:{“name”:“juan”,“score”:0}然后我需要写例如'console.log($scope.people['juan' ]) 我需要得到对象而不必循环。怎么办?在您的代码中。
    • @yavg 你的意思是什么`我需要得到对象而不需要循环。`?
    • 例如我需要(这是对象“juan1”:{“name”:“juan”,“score”:0})console.log($scope.people['juan1'] .name)=='juan' 好吗?
    • 例如没有循环,这是直接的
    • for(var i in $scope.people){ if $scope.people[i].name=='juan} 我不想这样做
    【解决方案3】:

    AngularJS 1.4 这是在ng-repeat 中为对象排序的实现

    1.4 版删除了字母排序。我们现在依赖订单 在 myObj 中运行 for key 时由浏览器返回。

    因此,如果您无法更改模型的结构,请重新排序对象以便将分数作为第一个属性:

    $scope.people={ 
        "juan": { "score": 2, "name": "juan" },
        "pedro": { "score":0, "name": "pedro" },
        "goku": { "score":1, "name": "goku" }
      }
    

    即使在您的结构中也可以使用,而无需在 ng-repeat 中指定任何 orderBy

    如果要动态重新排序对象,可以执行以下操作:

    for (var key in $scope.people) {
      $scope.people[key] = Object.assign({score: $scope.people[key].score}, $scope.people[key]);
    } 
    

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多