Angular: получить последние 3 элемента объекта json

У меня есть страница, на которой перечислены элементы, и пользователи могут добавлять к ним комментарии.

  1. На этой странице я хотел бы отобразить последние 3 добавленных комментария. Любые советы о том, как получить последние 3 комментария от объектов JSON?
  2. Также при добавлении нового комментария, как я могу увеличить номер комментария (сейчас жестко закодирован)?

См. мой код: http://plnkr.co/edit/iOBXuQVY40LD8d8QV5ss?p=preview

Спасибо


person John    schedule 28.04.2013    source источник
comment
В моем ответе отображаются последние три комментария, обновляется количество комментариев (включая описание каждого добавленного комментария). Это то, чего вы хотите достичь?   -  person lucuma    schedule 29.04.2013
comment
@lucuma, есть ли шанс, что вы могли бы взглянуть на мой РЕДАКТИРОВАТЬ?   -  person John    schedule 04.05.2013
comment
Я разветвил его и внес некоторые изменения: plnkr.co/edit/6LKdy43jw6o4J507YfKc?p=preview Я думаю, то, что у вас было, можно было бы упростить. Проверьте это.   -  person lucuma    schedule 04.05.2013
comment
Вместо того, чтобы задавать дополнительные вопросы, пожалуйста, ответьте на один из постов ниже. Я считаю, что все они отвечают на ваш первоначальный вопрос   -  person lucuma    schedule 05.05.2013
comment
Вы уже получили ответ, поэтому, по-видимому, вы задаете новый вопрос, поэтому вы можете опубликовать свои изменения как новый конкретный вопрос.   -  person lucuma    schedule 08.05.2013
comment
@lucuma Не беспокойтесь, я создал для него новый вопрос stackoverflow.com/questions/16448973/   -  person John    schedule 08.05.2013


Ответы (3)


Расширение других ответов: вы должны посмотреть на добавление идентификатора или даты к каждому комментарию. Для моего примера решения я использовал «ID».

В моем разветвленном фрагменте я добавил итог и кнопку «показать больше» для расширяемого списка комментариев. Размер управляется переменной 'limit'.

Кроме того, переменная 'itemID' внутри $scope.addMessage() добавляет ID к каждому комментарию. Это решит часть 2 вашего вопроса.

Планкер: http://plnkr.co/edit/bAtXmCls2gk8p5WAHsrM?p=preview

$scope.addMessage (добавляет элемент, описание имеет значение того, что вы указали в поле ввода, и сбрасывает ограничение до последних 3)

  $scope.addMessage = function(mess) {
    var itemID = $scope.items[0].comments.length + 1;
    $scope.items[0].comments.push(
          {
            "id": itemID,
            "name":"user" + itemID,
            "description": mess
          }
      );
    $scope.totalItems = itemID;
    $scope.limit = 3;
  }

$scope.showMore (увеличивает лимит на 3)

  $scope.showMore = function() {
    $scope.limit += 3;
  }

JSON: я немного изменил его. 'comments' теперь представляет собой массив, а также добавлен 'id'

    "comments":
    [
      {
        "id": 1,
        "name":"user1",
        "description": "This is comment 1"
      },
      {
        "id": 2,
        "name":"Jane D.",
        "description": "This is comment 2"
      },
      ...
    ]
person mnsr    schedule 29.04.2013
comment
Спасибо за ваши ответы, ребята! Идентификатор комментариев должен был быть добавлен к моему исходному коду.. мой плохой. @rudeovski-ze-bear Ваша версия кажется близкой к тому, что я искал. Я протестирую его и вернусь к вам как можно скорее. Спасибо еще раз. - person John; 30.04.2013
comment
@ Патрис, без проблем. Помните, что если это действительно решило вашу проблему, отметьте ее как решенную. - person mnsr; 01.05.2013
comment
Еще несколько вопросов, если можно? См. мой EDIT и plunker plnkr.co/edit/w4Tpz0Tp53fXRZj7Jbbe?p= предварительный просмотр Добавлены некоторые комментарии к коду. - person John; 02.05.2013

Посмотрите на фильтр limitTo. Вы можете указать с конца списка, используя отрицание.

Вы могли бы сделать

message in item.comments|limitTo:-3

Также для ваших комментариев вы не должны использовать их как словарь объектов, а просто использовать такой массив:

"comments":
        [
          {
            "id": "comment1",
            "name":"user1",
            "description": "This is comment 1"
          },
          {
            "id": "comment2",
            "name":"Jane D.",
            "description": "This is comment 2"
          },
          {
            "id": "comment3",
            "name":"Jone D.",
            "description": "This is comment 3"
          },
          {
            "id": "comment4",
            "name":"Test",
            "description": "This is comment 4"
          },
          {
            "id": "comment5",
            "name":"user",
            "description": "This is comment 5"
          }
        ]

Если они еще не в порядке, вам может потребоваться добавить поле сортировки даты и отсортировать их после того, как вы их вставите.

Вот обновление плунжера, чтобы помочь вам. Обратите внимание, что ваш ng-repeat также был не в том месте.

person Ryan Q    schedule 29.04.2013

Есть несколько замечаний:

Я изменил комментарии, чтобы они были массивом в json. По какой-то причине он у вас был как объект.

Вы можете использовать фильтр limitTo, чтобы ограничиться тремя последними. <li ng-repeat="message in item.comments | limitTo:-3"></li>

Мой ответ включает в себя общий и действующий комментарий.

Код контроллера:

myApp.controller('ItemController', function($scope, $route, $location, $http, Items){

  Items.get(function(response){
    $scope.items = response; 

  })

  $scope.$watch('items', function() {
     $scope.total = $scope.items[0].comments.length;
  });

  $scope.addMessage = function(mess) {
    $scope.items[0].comments.push(
      {
        "name":"user1",
        "description": "This is comment " + ($scope.total + 1) 
      }
    );
  }

})

Обновленный Plunkr: http://plnkr.co/edit/2oWLRU06Kdp0yKqjodmv?p=preview

person lucuma    schedule 29.04.2013
comment
еще 2 вопроса по той же теме, если можно? Смотрите мой РЕДАКТИРОВАТЬ. Расширение из вашего плункера: plnkr.co/edit/W5FibkcRzjKeM5iO2gtn?p=preview - person John; 08.05.2013