AngularJS orderBy дочернее свойство не работает

Как упорядочить список элементов по дочернему свойству "active" : true? Первый узел — это динамически вставляемый идентификатор для каждого друга.

<li data-ng-repeat="friend in friends|orderBy:'friend.active':true">
        <span class="name">{{friend.name}}</span>
        <span class="phone">{{friend.lastName}}</span>
</li>

$scope.friends = {
    "12345": {
        "name": "Dhiraj",
        "lastName": "Agarwal",
        "active" : false
    },
    "23456": {
        "name": "Poonam",
        "lastName": "Mittal",
        "active" : false
    },
    "34567": {
        "name": "Suresh",
        "lastName": "Bansal",
        "active" : true
    },
    "45678": {
        "name": "Usha",
        "lastName": "Goel",
        "active" : false
    }
};

person Dhiraj Agarwal    schedule 05.06.2015    source источник
comment
вместо friend.active можно попробовать "friend in friends | orderBy: 'active': true" ?   -  person Shehryar Abbasi    schedule 05.06.2015
comment
orderBy используется с массивами, а не с объектами.   -  person dfsq    schedule 05.06.2015


Ответы (2)



Обычный ng-filter orderBy принимает только массив.

Использование такого рода данных отлично работает:

 $scope.friends = [{
            "name": "Dhiraj",
                "lastName": "Agarwal",
                "active": false

    },  {
            "name": "Poonam",
                "lastName": "Mittal",
                "active": false

    },{
            "name": "Suresh",
                "lastName": "Bansal",
                "active": true

    }, {
            "name": "Usha",
                "lastName": "Goel",
                "active": false

    }];

демонстрация jsfiddle

EDIT: если вы не хотите использовать массив, вы можете использовать обходной путь, описанный в этом угловом проблема

Фильтр (не настроенный и использующий подчеркивание):

app.filter('toArray', function() { return function(obj) {
    if (!(obj instanceof Object)) return obj;
    return _.map(obj, function(val, key) {
        return Object.defineProperty(val, '$key', {__proto__: null, value: key});
    });
}});

Пример разметки:

<div ng-repeat="val in object | toArray | orderBy:'priority' | filter:fieldSearch">
  {{val.$key}} : {{val}} 
</div>
person jbigman    schedule 05.06.2015
comment
В вашем решении вы удалили ключи, связанные с каждым объектом. В моей реализации невозможно удалить эти ключи. - person Dhiraj Agarwal; 05.06.2015