$http is getting called multiple times in AngularJS
可能重复对不起,我没有50个声誉对同一篇文章发表评论。 我们使用http服务调用api,并且所有服务都具有通过cookiestore值传递的会话ID。 api调用第一次不起作用,因为在第一次调用期间会话id为空,并且它仅适用于第二次调用。
任何人都可以帮助我们。我们有多个api,并且都发生了两次,这实际上增加了负载。是的,我们已经研究过了。
angular.module('adminsuite',['ngFileUpload','ui.router','ngCookies','angular-clipboard','ngAnimate', 'ngSanitize', 'ui.bootstrap','ngMessages']).constant("__env",env).config(function($stateProvider, $urlRouterProvider, $locationProvider) {
$urlRouterProvider.otherwise('/');
//$locationProvider.html5Mode(true);
$stateProvider
.state('login', {
url: '/',
views:{
header:{
templateUrl: '',
controller: ''
},
pageContent:{
templateUrl: 'Login/login3.html',
controller: 'loginController'
},
footer:{
templateUrl: 'common/footer3.html',
controller: 'footerController'
}
}
})
// HOME STATES AND NESTED VIEWS ========================================
.state('dashboard', {
url: '/dashboard',
views:{
header:{
templateUrl: 'common/header.html',
controller: 'headerController'
},
pageContent:{
templateUrl: 'dashboard/dashboard.html',
controller: 'dashboardController'
},
footer:{
templateUrl: 'common/innerFooter.html',
controller: 'footerController'
}
}
})
//SURVEY STATES
.state('survey', {
url: '/survey',
views:{
header:{
templateUrl: 'common/headerTool.html',
controller: 'headerController'
},
pageContent:{
templateUrl: 'survey/survey.html',
controller: 'surveyController'
},
footer:{
templateUrl: 'common/innerFooter.html',
controller: ''
}
}
});
// ABOUT PAGE AND MULTIPLE NAMED VIEWS =================================
})
UserService.GetByUsername(requestData)
.then(function (user) {
console.log(user);
if (user.SessionID) {
sessionID = user.SessionID;
userDetails = user.UserProfile;
response = { success: true};
} else {
response = { success: false, message: 'Username or password is incorrect' };
}
callback(response);
});
UserService.js
function GetByUsername(user) {
//console.log(__env.apiUrl);
return $http.post(__env.apiUrl+'/UserAuthentication/login', user, {headers: { 'Content-Type': 'application/json'}}).then(handleSuccess, handleError('Error getting user by username'));
}
$http.get(__env.apiUrl+'/UserSurvey/GetAllSurveys', {
headers: { 'Content-Type': 'application/json','SessionID':$rootScope.token}
})
.then(function(response){
console.log(response);
return response.data;
}, function(error){
console.log("error");
console.log(error);
return error;
});
任何帮助表示感谢。
答案 0 :(得分:0)
当我的AJAX模块位于普通Javascript中时,我的数据会在第一个服务器查询中呈现。但是,当我将AJAX模块放在AngularJS模块中时,我必须在数据呈现之前查询服务器两次。请注意,从UI调用查询。
在探索之后,我意识到数据确实已经到达第一个查询,并被分配给所有指定的对象和变量,但仅限于AngularJS代码的范围内。当然,数据是异步到达的,UI已经经历了一个摘要周期,没有理由再去,因为UI中的任何内容都没有改变。当UI发生变化时,Angular会更新所有内容,但在更改(到达数据)来自服务器时不执行任何操作。
随后,第二个相同的查询将强制使用摘要周期,并使用第一个查询中已经存在的数据更新所有绑定。
因此,目标是强制从Javascript的摘要周期更新您的UI绑定。我现在在回调函数结束时强制执行摘要循环。
要强制进行摘要循环,请在完成数据变量赋值后放置Angular方法$scope.$apply([exp])
。我在Angular文档中找到了有用的详细信息:https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$apply以及对http://jimhoskins.com/2012/12/17/angularjs-and-apply.html的工作示例的一个很好的解释,以及在强制摘要周期时使用“控制器为”语法的重要细节:{ {3}}并希望这可以解决双重HTTP调用的问题。
答案 1 :(得分:0)
假设您已使用AngularUI状态定义在应用程序中声明了控制器,例如:
$stateProvider
.state('index',
{
url : '/',
templateUrl : 'templates/home.html',
controller : 'HomeController'
})
然后,在home.html视图模板中,您还使用ng-controller指令声明控制器,如下所示:
<div ng-controller="HomeController">
然后,您没有意识到,却将控制器连接了两次(一次通过状态定义,两次通过ng-controller指令),这导致控制器中包含的代码也执行两次。