我有一个多次调用的角度服务函数。
在index.html
页面中,我有以下一行:
<li><i class="pull-right"></i><br/>{{appCtrl.service.getCurrentUser()}} </li>
在应用程序控制器中,我设置了变量
appCtrl.controller('AppController', function ($state, securityService, $log) {
$log.info('App controller');
var appCtrl = this;
appCtrl.service = securityService;
});
在我的服务中,我公开了这个功能
login.factory('securityService', function ($window, $log) {
var currentUser;
return {
setCurrentUser: function (user) {
currentUser = user;
$window.sessionStorage.setItem('User', JSON.stringify(currentUser));
},
getCurrentUser: function () {
$log.info('Calling current user');
if (!currentUser) {
var storedObject = $window.sessionStorage.getItem('User');
currentUser = JSON.parse(storedObject);
}
return currentUser;
}
}
});
当应用程序启动或页面刷新完成时,getCurrentUser
函数中的以下行会被多次调用。
$log.info('Calling current user');
控制器只被调用一次,我通过查看$log.info('App controller');
它是作为脏检查过程的一部分被调用还是我做错了什么?
答案 0 :(得分:5)
Angular会在每个摘要周期调用您的函数,您可以在函数内部设置断点并进行检查。如果您使用的是1.3版本,请查看One Time Binding功能。如果没有,则调用控制器内的服务并将视图绑定到某个范围变量:
$scope.currentUser = securityService.getCurrentUser();
内部视图绑定到范围变量:
{{currentUser}}
答案 1 :(得分:0)
试试这个,这是正确的工厂声明。因为每次注入(使用)你的工厂时,AngularJS内部就会调用你的工厂:securityService(injects);
。
login.factory('securityService', function ($window, $log) {
var currentUser;
return {
setCurrentUser: function (user) {
currentUser = user;
$window.sessionStorage.setItem('User', JSON.stringify(currentUser));
},
getCurrentUser: function () {
$log.info('Calling current user');
if (!currentUser) {
var storedObject = $window.sessionStorage.getItem('User');
currentUser = JSON.parse(storedObject);
}
return currentUser;
}
};
});