我从角度调用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;
});
}
}
]);
答案 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路由器。