@boozzd

Как прослушать в директиве изменения в сервисе(Angular js)?

Есть сервис, который отвечает за авторизацию:
function AuthService($http, ipCookie, $location){
       return {
        auth: auth,
        isAuth: isAuth,
        logout: logout
       }
       function auth(credentials, callback){
        $http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded; charset=utf-8";
        $http({
            method: 'post',
            url: '/rest/?route=user/login',
            data: {'name': credentials.login, 'password': credentials.password}
        }).success(Success);
        
        function Success(data){
            if(angular.isObject(data)){
                ipCookie('login',data);
            }
                callback(ipCookie('login'));
        }
    }
    function isAuth(){
        var trigg = (ipCookie('login') === undefined) ? false : ipCookie('login');
        return trigg;
    }
    function logout(){
        $http({
            method: "post",
            url: '/rest/?route=user/logout'
        }).success(Success);
        function Success(data){
            if(data == 0){
                ipCookie.remove('login');
                $location.path('login');
            }
        }
    }
}

и есть директива для меню:
function navbarDirective(auth){
    var elements = '<div class="navbar navbar-default" role="navigation" ng-show="menuShow">'+
        '</div>';
    return {
        restrict: 'EA',
        template: elements,
        link: function(scope, element, attrs){
            scope.$watch(function(scope){
                if(auth.isAuth()) {
                    scope.menuShow = true;
                    scope.credentials = auth.isAuth();
                }else{
                    scope.menuShow = false;
                }
            });
            scope.logout = function(){
                auth.logout();
            }
        }
    }
}

Как мне скрывать меню или показывать, когда я залогинился или же разлогинился? Буду рад любой критике данного кода.
  • Вопрос задан
  • 2504 просмотра
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Для этого лучше использовать события. Они сработают моментально, не завязаны на $digest циклах и т.д. Лепить для этого добра байндинги неоправданно большой оверхэд. Вообще если речь идет о уведомлении о изменении состояния глобально, то лучше просто в $rootScope эмитить событие которое будет распространяться вниз по всем дочерним.

p.s. почему вы не пользуетесь промисами? вместо
myService.auth(data, function () {
    alert('success');
});

можно делать так:
myService.auth(data).then(function () {
});

при этом у вас появляется масса возможностей. Можно вклиниваться в цепочки промисов, можно ждать пока не завершится несколько паралельных запросов. Можно посредством цепочки промисов видоизменять данные:
myService.auth().then(function (userId) {
    return user.get(userId);
}).then(function (user) {
    // тут можно чего с пользователем поделать
    return user.friends;
}).then(function (friends) {
   if( !friends.length) {
        return $q.reject('У вас 0 друзей :(');
   }
   return $q.all(friends.map(function (user) {
        profile.get(user.id);
   });
}).then(function (friendsProfiles) {
    $scope.friends = friendsProfiles;
}, function (error) {
     alert(error);
});

надеюсь понятно обрисовал возможности. Сервис $http и почти все сервисы в ангуляре возвращают промисы. Забудьте о тупых колбэках.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы