【问题标题】:orderBy:notarray Expected array but received: ObjectorderBy:notarray 预期的数组,但收到:对象
【发布时间】:2016-12-16 00:24:38
【问题描述】:

我正在尝试按位置过滤我的结果。

但是,由于结果不是数组,因此 orderby 会立即破坏页面。我怎样才能改变这个?我被这个困住了。

我是这样做的:

<div ng-repeat="cat in content | orderBy : 'pos'" class="animated zoomIn">

和控制器:

firebase.database().ref("v3/standalonelist/" + catId.toLowerCase()).on('value', function(snapshot) {

    $timeout(function() {
      $scope.content = snapshot.val();
      console.log($scope.content);

    })

  });

$scope.content 返回这个对象:

{
  "Bar One" : {
  "bgurl" : "https://domain.com/aa/bars/list/bar.jpg",
  "name" : "Bar One",
  "subtitle" : "Cheers",
  "pos", 2

},
"Bar Two" : {
  "bgurl" : "https://domain.com/aa/bars/list/bar.jpg",
  "name" : "Bar Two",
  "subtitle" : "Cheers",
  "pos", 1
 }

}

我得到这个错误:

[orderBy:notarray] 预期的数组但已收到:[THE OBJECT ABOVE]

【问题讨论】:

  • 错误为真,这是一个包装另一个对象的对象。你的内容应该是这样的: $scope.content = [ { "bgurl" : "domain.com/aa/bars/list/bar.jpg", "name" : "Bar One", "subtitle" : "Cheers", "pos", 2 }, { " bgurl" : "domain.com/aa/bars/list/bar.jpg", "name" : "酒吧二", "subtitle" : "干杯", "pos", 1 } ]

标签: html angularjs firebase firebase-realtime-database


【解决方案1】:

1) 自定义过滤器 (AngularJS) 用于 orderBy Object 属性..

示例 JSON:

{ 
   "123": {"name": "Test B", "position": "2"},
   "456": {"name": "Test A", "position": "1"}
}

试试这个链接...

orderBy filter for Object

2) 另一种实现对象属性 orderBy 过滤器的方法。

  • 添加数据对象数组:

$scope.dataArray = Object.keys($scope.data) .map(function(key) { return $scope.data[key]; });

在视图中:

<div ng-repeat="item in dataArray | orderBy:'order.allListPosition'">

http://plnkr.co/edit/BXgYPTElSM3sjvLg30CL?p=preview

【讨论】:

    【解决方案2】:

    你的模型是对象而不是数组,所以你应该使用(key, value) in experssion synatx。

    【讨论】:

    • 谢谢。可以举个例子吗?
    • 对于对象内部的属性排序,您不能使用由 angular 处理的 orderBy 过滤器,因为它对集合进行排序。要解决您的问题,您应该更改数据结构以提供集合,或者在对象内创建自定义过滤器或排序属性。
    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2018-02-25
    • 2014-05-14
    • 2015-03-11
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多