更新时的角度服务

时间:2015-12-01 13:10:50

标签: angularjs

我正在制作这个模块,用于跟踪用户是否在线,因此我写了以下工厂

var app = angular.module('cskiwi.general-utilities', [])
.factory('cskiwiUtilities', function ($rootScope, $window) {
    var networkInfo = function() {
        // check if online
        var online = $rootScope.online = window.navigator.onLine;
        $window.addEventListener("offline", function() {
            $rootScope.$apply(function() {
                online = $rootScope.online = false;
            });
        }, false);

        $window.addEventListener("online", function() {
            $rootScope.$apply(function() {
                online = $rootScope.online = true;
            });
        }, false);

        // update changes
        $rootScope.$watch('online', function(newStatus) {
            $rootScope.$broadcast('onlineUpdate', newStatus);
        });

        return { online: online };
    };

    //public methods & properties
    var self = {
        networkInfo: networkInfo
    };


    return self;
});

现在我可以执行以下操作:$scope.networkInfo = cskiwiUtilities.networkInfo();

这样可行,但如果连接断开或重新连接,则不会更新$scope.networkinfo。我可以听广播,但我想我可以放弃广播部分

1 个答案:

答案 0 :(得分:1)

您可以简单地观看cskiwiUtilities.networkInfo()调用,以便在值更改时更新范围属性:

$scope.$watch(function() {
    return cskiwiUtilities.networkInfo();
}, function(networkInfo) {
    $scope.networkInfo = networkInfo;
})

根据您的需求和用途,您可能还希望在任何地方都可以访问这些信息,方法是在服务中的$ rootScope上进行设置:

 $rootScope.$watch('online', function(newStatus) {
     $rootScope.$broadcast('onlineUpdate', newStatus);
     $rootScope.networkInfo = newStatus;
 });

然后,可以在应用程序的任何非隔离部分(范围)访问“networkInfo”道具。