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

Angular factory всегда называется дважды

Я звоню в службу REST из angular, и он всегда вызывает factory дважды. Вот код factory.

app.factory('dataFactory', ['$http', function ($http) {
    var urlBase = '/api';
    var dataFactory = {};

    dataFactory.getMyItems = function () {            
        return $http.get(urlBase + '/MyItems');
    };

    return dataFactory;
} ]);

Он вызывается из контроллера здесь

app.controller('MyItemsController', ['$scope', 'dataFactory',
    function ($scope, dataFactory) {            
        $scope.myItems;

        getItems();

        function getItems() {

            dataFactory.getMyItems()
                .success(function (itemsData) {
                    $scope.myItems = itemsData;
                })
                .error(function (error) {
                    $scope.status = 'Unable to load items data: ' + error.message;
                });
        }
    }
]);
4b9b3361

Ответ 1

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

Но посмотрев на это решение: Дважды удваивает выполнение контроллера AltularJS

Шаг 1:

Убедитесь, что вы добавили службу и контроллер в свой (основной вид макета) только один раз.

Пример:

index.html

  <script src="../MyItemsController.js"></script>
  <script src="../MyItemsService.js"></script>

Если проблема по-прежнему сохраняется после выполнения шага 1, перейдите к шагу 2


Шаг 2:

Есть два способа сделать это:

1. Либо держите контроллер в своем представлении (ng-controller), и удалите его из своего конфигурационного маршрута следующим образом:

config (обычно, app.js):

 app.config(['$routeProvider', function($routeProvider){
      $routeProvider.when('/',
               { 
                   templateUrl: 'pages/home.html'
                   //Remove controller from here
               });
}]);

home.html

 <!-- Add the ng-controller in your view -->
    <div ng-controller="MyItemsController">
        <!-- Your stuff -->
    </div>

2. Или держите контроллер в своем конфигурационном маршруте и удалите ng-controller   из вида:

config (обычно, app.js):

  app.config(['$routeProvider', function($routeProvider){
      $routeProvider.when('/',
               { 
                   templateUrl: 'pages/home.html',
                   controller: 'MyItemsController' //Add the controller here

               });
}]);

home.html

 <!-- Remove the ng-controller in your view -->
    <div>
        <!-- Your stuff -->
    </div>

Примечание. Вышеупомянутое решение также работает с ui-маршрутизатором.