角度服务功能被多次调用

时间:2015-10-06 13:25:21

标签: angularjs

我有一个多次调用的角度服务函数。 在index.html页面中,我有以下一行:

<li><i class="pull-right"></i><br/>{{appCtrl.service.getCurrentUser()}}&nbsp;</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');

来监控它

它是作为脏检查过程的一部分被调用还是我做错了什么?

2 个答案:

答案 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;
            }  
        };

});