Подтвердить что ты не робот

Пропуск ng-repeat JSON в Angular JS

Кто-нибудь знает, как я могу SKIP упорядочить JSON вообще, когда я использую ng-repeat (возможно, безболезненно)?

Например, мой источник JSON выглядит примерно так:

{
   "title": "Title",
   "description": "Description",
   "moreInfo": "Moreinformation"
}

Как только я использую его в ng-repeat, он упорядочивает их по алфавиту. Что-то вроде этого -

{
   "description": "Description",
   "moreInfo": "Moreinformation",
   "title": "Title"
}

Мой ng-repeat выглядит примерно так:

<div ng-repeat="(key,data) in items">
   <span class="one"> {{key}} </span>
   <span class="two"> {{data}} </span>
</div>

Я видел людей, имеющих отдельный массив ключей и использующих их для идентификации объектов JSON, в конечном счете избегая сортировки по алфавиту.

Есть ли элегантный способ сделать это?

4b9b3361

Ответ 1

Хорошее обходное решение найдено в группах google:

    <div ng-repeat="key in notSorted(data)" ng-init="value = data[key]">
         <pre>
               key: {{key}}
               value: {{value}}
         </pre>           
    </div>

И в области:

    $scope.data = {
        'key4': 'data4',
        'key1': 'data1',
        'key3': 'data3',
        'key2': 'data2',
        'key5': 'data5'
    };

    $scope.notSorted = function(obj){
        if (!obj) {
            return [];
        }
        return Object.keys(obj);
    }

Работа: http://jsfiddle.net/DnEXC/

Оригинал: https://groups.google.com/forum/#!topic/angular/N87uqMfwcTs

Ответ 2

Этот ответ с использованием фильтра работает лучше всего для меня.

https://groups.google.com/d/msg/angular/N87uqMfwcTs/EGoY6O2gtzsJ

http://jsfiddle.net/er52h/1/

angular.module('myFilters', [])
  .filter('keys', function() {
    return function(input) {
      if (!input) {
        return [];
      }
      return Object.keys(input);
    }
  });

Вы можете использовать следующее:

<div ng-repeat="key in data | keys" ng-init="value = data[key]"></div>

Ответ 3

Я использую этот подход для переопределения алфавитного порядка:

контроллер

$scope.steps = {
    "basic-settings": "Basic Settings",
    "editor": "Editor",
    "preview-and-publish": "Preview & Publish"
};

// NOTE I realise this is a hacky way, but I need to override JS alphabetical ordering
$scope.stepsKeys = _.keys($scope.steps);

$scope.activeStep = 0;

ОБРАТИТЕ ВНИМАНИЕ, что _.keys($ scope.steps); LoDash, заменяя Object.keys();

HTML

<ul>
    <li ng-repeat="key in stepsKeys" ng-class="{active : stepsKeys[activeStep] == key}">{{ steps[key] }}</li>
</ul>

Ответ 4

На данный момент нет элегантного способа сделать это. Причина в том, что ngRepeat создает ассоциативный массив, который вызывается, а не сам JSON. Хотя в стандарте ECMAScript упоминается, что:

Порядок объявления свойств объекта должен быть сохранен, и итерация должна выполняться в том же порядке.

Но почему-то ребята Angular не обратили на это внимания. Это может быть исправлено в последующих выпусках.

Я все еще думаю, что поведение Angular имеет больше смысла. Поскольку объекты часто имеют больше логики инициализации вокруг них, чем массивы, я считаю справедливым предположить, что порядок часто может быть не тем, чего пользователь хочет/ожидал, поэтому принудительная сортировка гарантирует правильное поведение - особенно когда нам также приходится иметь дело с более старыми браузерами.