【问题标题】:Angular factory always called twiceAngular 工厂总是调用两次
【发布时间】:2014-05-05 19:43:20
【问题描述】:

我从 Angular 调用 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;
                });
        }
    }
]);

【问题讨论】:

  • 如果您的控制器被实例化两次,就会发生这种情况。将 console.log 作为控制器函数的第一行并查看控制台输出。
  • @Chandermani 控制器被实例化了两次。我找不到在哪里,它在视图中只被引用一次 data-ng-controller="MyItemsController"
  • 检查您的 routeProvider 配置。搜索字符串MyItemsController
  • @Chandermani 我从 routeProvider 中删除了它,它不会调用两次。当我从data-ng-controller 视图中删除它时,它仍然调用了两次。正确的做法是什么?
  • 同时检查你是否没有在index.html 中包含两次angular.js<controller.js> 文件。我曾经遇到过这个问题。

标签: angularjs


【解决方案1】:

我遇到了和你一样的问题,控制器通常被调用了两次;因此,工厂将被调用两次。

但是在看了这个解决方案之后: 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 路由器。

【讨论】:

  • 第二步,祝福你。当我的路由器已经在处理这个问题时,从一个网站切换到一个网络应用程序会在我的视图中留下 ng-controllers,我完全认为我已经在迁移过程中删除了它们。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多