Ошибка приложения AngularJS 1.6: преобразование элементов в сервис не работает - PullRequest
0 голосов
/ 08 декабря 2018

Я делаю небольшое приложение Contacts с Bootstrap 4 и AngularJS v1.6.6 .

Приложение просто отображает Users JSON.Поскольку JSON возвращает большое количество пользователей, приложение также имеет функцию разбивки на страницы.

Разбиение на страницы работало нормально как часть контроллера приложения, но, поскольку я попытался превратить его в службу, оно не работаетбольше.

См. функциональную версию приложения с нумерацией внутри контроллера ЗДЕСЬ .

Контроллер приложения:

// Create an Angular module named "contactsApp"
var app = angular.module("contactsApp", []);

// Create controller for the "contactsApp" module
app.controller("contactsCtrl", ["$scope", "$http", "$filter", "paginationService", function($scope, $http, $filter) {
  var url = "https://randomuser.me/api/?&results=100&inc=name,location,email,cell,picture";
  $scope.contactList = [];
  $scope.search = "";
  $scope.filterList = function() {
    var oldList = $scope.contactList || [];
    $scope.contactList = $filter('filter')($scope.contacts, $scope.search);
    if (oldList.length != $scope.contactList.length) {
      $scope.pageNum = 1;
      $scope.startAt = 0;
    };
    $scope.itemsCount = $scope.contactList.length;
    $scope.pageMax = Math.ceil($scope.itemsCount / $scope.perPage);
  };

  $http.get(url)
    .then(function(data) {
      // contacts arary
      $scope.contacts = data.data.results;
      $scope.filterList();

      // Pagination Service
      $scope.paginateContacts = function(){
        $scope.pagination = paginationService.paginateContacts();
      }

    });
}]);

Служба:

app.factory('paginationService', function(){
     return {
        paginateContacts:  function(){
            // Paginate
            $scope.pageNum = 1;
            $scope.perPage = 24;
            $scope.startAt = 0;
            $scope.filterList();

            $scope.currentPage = function(index) {
                $scope.pageNum = index + 1;
                $scope.startAt = index * $scope.perPage;
            };

            $scope.prevPage = function() {
                if ($scope.pageNum > 1) {
                    $scope.pageNum = $scope.pageNum - 1;
                    $scope.startAt = ($scope.pageNum - 1) * $scope.perPage;
                }
            };

            $scope.nextPage = function() {
                if ($scope.pageNum < $scope.pageMax) {
                    $scope.pageNum = $scope.pageNum + 1;
                    $scope.startAt = ($scope.pageNum - 1) * $scope.perPage;
                }
            };
        }
    }
});

В представлении:

<div ng-if="pageMax > 1">
        <ul class="pagination pagination-sm justify-content-center">
            <li class="page-item"><a href="#" ng-click="prevPage()"><i class="fa fa-chevron-left"></i></a></li>
            <li ng-repeat="n in [].constructor(pageMax) track by $index" ng-class="{true: 'active'}[$index == pageNum - 1]">
                <a href="#" ng-click="currentPage($index)">{{$index+1}}</a>
            </li>
            <li><a href="#" ng-click="nextPage()"><i class="fa fa-chevron-right"></i></a></li>
        </ul>
</div>

Файл службы включен в проект (правильно, на мой взгляд) после app.jsfile:

<script src="js/app.js"></script>
<script src="js/paginationService.js"></script>

Я не продвинутый пользователь AngularJS, поэтому я не знаю: чего не хватает?

1 Ответ

0 голосов
/ 11 декабря 2018

Похоже, что служба должна быть определена до контроллера, иначе она не может быть введена должным образом.

Таким образом, вы можете переместить paginationService в app.js:

var app = angular.module("contactsApp", []);
app.factory('paginationService', function(){
    //...
});
app.controller("contactsCtrl", ["$scope", "$http", "$filter", "paginationService", function($scope, $http, $filter) {
    //...
});

Или же переместите контроллер в отдельный файл, включенный после файла paginationServices.js.

Посмотрите на этот плункер .Попробуйте изменить строку 6 - удалите символ 5, то есть пробел, который разделяет звезду и косую черту, которая закрывает многострочный комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...