Angular工厂总是叫两次

时间:2014-03-27 02:54:07

标签: angularjs

我从角度调用REST服务,它总是调用工厂两次。这是工厂代码。

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;
                });
        }
    }
]);

1 个答案:

答案 0 :(得分:26)

我和你的问题一样,控制器一般被调用两次;因此,工厂将被召集两次。

但在查看此解决方案之后: Combating AngularJS executing controller twice

第1步:

确保仅在(主布局视图)中添加服务和控制器一次。

示例:

的index.html

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

如果在执行第1步后问题仍然存在,请转到步骤2


第2步:

有两种方法: -

<强> 1。将控制器保留在视图中(ng-controller),然后将其从配置路径中删除,如下所示:

路由配置(通常是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     从这样的观点来看:

路由配置(通常是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路由器。