多次调用角度服务功能
问题描述:
我有一个多次调用的角度服务功能。 在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');
监视它也被称为脏检查过程的一部分,还是我做错了什么?
答
试试这个,这是正确的工厂声明。因为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;
}
};
});
答
角呼叫您的每功能消化周期,可以设置在函数内部断点,并检查它。如果你在1.3版本,那么请看看One Time Binding的功能。如果没有,那么调用控制器和绑定视图内的服务在一定范围变量:
$scope.currentUser = securityService.getCurrentUser();
,并查看绑定到范围变量中:
{{currentUser}}
嗨,与功能设置为可变问题应用程序控制器是应用程序控制器通过应用程序启动将该变量设置为初始值(未定义)。当工厂的setCurrentUser被登录控制器调用时,应用程序控制器中的变量不会被更新。 – Rentius2407
然后我会使用一些标准的事件机制(所有这$广播/ $发射/ $的东西)更新其他控制器时,用户值更新登录控制器。 – udalmik
谢谢udalmik,我已经参加了$广播和$对策略。它适用于我的场景。 – Rentius2407