Угловые кнопки previous / next на странице сведений и маршрутизация через параметры


Я создал этот поршень моего проекта до сих пор.

Моя самая большая проблема связана с кнопками 'Next/Previous' item, его функционирование в некоторой степени, однако есть две проблемы с ним.

Во-первых, по-видимому, существует некоторое несоответствие с фильтрацией данных и индексацией. Чтобы проиллюстрировать это, откройте галерею "живопись" , вы увидите предметы, перечисленные погоду , Как и ожидалось. Однако при перемещении между элементами в детальном представлении они перечислены просто в том порядке, в котором они появляются в объекте json, и подкачка работает только частично.

Список элементов в галерее "чертеж" уже находится в хронологическом порядке в файле json, и поэтому галерея, похоже, работает должным образом.

Во-вторых, способ отображения кнопок prev / next кажется избитым, но это единственный способ, которым я смог заставить его работать до сих пор.

Это мой контроллер для просмотра списка и подробных представлений:

galleryControllers.controller('ArtworkCtrl', ['$scope', '$routeParams', '$http', '$filter', function($scope, $routeParams, $http, $filter) {
    $scope.url = $routeParams.artworkUrl;
    $http.get('gallery.json').success(function(data) {
        // get genre from url
        $scope.artworks = $filter('filter')(data, {
            genre: $routeParams.artworkGenre
        });
        var artworks = $scope.artworks;

        // get item from url
        $scope.artwork = data.filter(function(entry) {
            return entry.url === $scope.url;
        })[0];
        var artwork = $scope.artwork;

        var url = $scope.url;
        //$scope.orderProp = 'year';

        // current artwork
        //$scope.currentArtwork = $scope.artworks[currentIndex];

        // the index of the selected artwork in the array.
        var currentIndex = $scope.artworks.indexOf($scope.artwork);

        $scope.prevArtwork = function(currentIndex) {
            var prevIndex = currentIndex - 1;
            if (prevIndex < 0) {
                // move over to the last index, if we already are at the start
                prevIndex = $scope.artworks.length - 1;
            }
            //console.log(artworks[prevIndex].url);
            return prevIndex;
        }

        $scope.nextArtwork = function(currentIndex) {
            var nextIndex = currentIndex + 1;
            if (nextIndex >= $scope.artworks.length) {
                // move over to start if we already were at the end of the list
                nextIndex = 0;
            }
            //console.log(artworks[nextIndex].url);
            return nextIndex;
        }
    });
}]);
1 2

1 ответ:

В конце концов я понял это сам, сначала я использовал это, чтобы изменить порядок массива:

  artworks.sort(function (a, b) {
    return b.year.localeCompare(a.year);
  });

Во-вторых, я изменил свою предыдущую / следующую часть контроллера на эту:

  /* previous button */
  if (currentIndex > 0)
    $scope.prevArtwork = Number(currentIndex) - 1;
  else
    $scope.prevArtwork = artworks.length - 1;

  /* next button */
  if (currentIndex < artworks.length - 1)
    $scope.nextArtwork = Number(currentIndex) + 1;
  else
    $scope.nextArtwork = 0;

Затем получил доступ к нему в шаблоне следующим образом:

{{artworks[prevArtwork].url}}

Работает отлично, без каких-либо халтурных вещей.