Угловая область не обновляется после вызова службы

У меня есть контроллер и сервис.

Служба выполняет http.get и возвращает true в случае успеха и false в случае ошибки.

Однако в контроллере он получает true или ложь правильно, но html привязки всегда отображается как истина??

Контроллер:

app.controller('MyController', function($scope, MyService) {

    MyService.getData(function(isLoggedIn, userData) {

        var loggedIn = isLoggedIn;    
        $scope.isLoggedIn = loggedIn;
        $scope.myUser = userData;
        //$scope.$evalAsync();
        //$scope.$apply();            
    });    
});

app.factory('MyService', function($http, $q) {
    return {

        getData: function(isLoggedIn, userModel) {
            $http.get('../assets/data/data.json')
                .success(function(data) {
                    userModel(data);
                    isLoggedIn(true);
                })
                .error(function(data, status, headers, config) {
                    // If 400 or 404 are returned, the user is not signed in.
                    if (status == 400 || status == 401 || status == 404) {
                        isLoggedIn(false);
                    }                    
                });
        }
    }
});

HTML:

{{isLoggedIn}}

В приведенном выше {{isLoggedIn}} всегда верно. Даже когда я изменяю http-вызов на:

$http.get('../blah/blah/blah.json')

В попытке заставить .error/fail.

Я пробовал $scope.$apply(), и я продолжаю получать ошибку цикла дайджеста в процессе. помощь!!!


person Oam Psy    schedule 03.02.2016    source источник
comment
Вы используете isLoggedIn и userModel в сервисе, как будто это методы... что вы передаете в сервис?   -  person tymeJV    schedule 03.02.2016
comment
@tymeJV - я ничего не передаю службе.   -  person Oam Psy    schedule 03.02.2016
comment
getData определяется двумя параметрами, вы передаете один аргумент (анонимная функция). И userModel в обратном вызове $http.get будет undefined, поскольку вы не передали второй аргумент, поэтому userModel(data); должно вызывать ошибку, вы проверили свою консоль?   -  person Patrick Evans    schedule 03.02.2016
comment
@PatrickEvans - правильно, userModel выдает ошибку   -  person Oam Psy    schedule 03.02.2016


Ответы (1)


Я думаю, вы немного смущены тем, как работают обратные вызовы. Ваш параметр isLoggedIn в службе — это функция обратного вызова, которую вы передаете. Ваш код исправлен:

app.controller('MyController', function($scope, MyService) {

    /*
    The function(response) { is your callback function being passed to the service
    */
    MyService.getData(function(response) {
        var loggedIn = response.isLoggedIn;    
        $scope.isLoggedIn = loggedIn;
        $scope.myUser = response.userModel;           
    });    
});

app.factory('MyService', function($http, $q) {
    return {
        getData: function(callback) {
            $http.get('../assets/data/data.json')
                .success(function(data) {
                    //Execute your callback function and pass what data you need
                    callback({userModel: data, isLoggedIn: true});
                })
                .error(function(data, status, headers, config) {
                    // If 400 or 404 are returned, the user is not signed in.
                    if (status == 400 || status == 401 || status == 404) {
                        callback({isLoggedIn: false});
                    }                    
                });
        }
    }
});

Вы должны использовать обещания... вот еще более рефакторинговая версия:

app.controller('MyController', function($scope, MyService) {
    MyService.getData().then(function(response) {
        var loggedIn = response.isLoggedIn;    
        $scope.isLoggedIn = loggedIn;
        $scope.myUser = response.userModel;           
    });    
});

app.factory('MyService', function($http, $q) {
    return {
        getData: function() {
            return $http.get('../assets/data/data.json')
                .then(function(response) {
                    return {
                        userModel: response.data, 
                        isLoggedIn: true
                    };
                }, function(data, status, headers, config) {
                    // If 400 or 404 are returned, the user is not signed in.
                    if (status == 400 || status == 401 || status == 404) {
                        return {isLoggedIn: false};
                    }                    
                });
        }
    }
});
person tymeJV    schedule 03.02.2016
comment
Спасибо, понятно, в рефакторинге 3 уровня возврата, все ли нужны? Просто пытаюсь понять это немного больше.. - person Oam Psy; 03.02.2016
comment
Да... так что первый return - это просто ваш объект со всеми вашими вызовами как функциями. Второй return возвращает все обещание $http, а третий возвращает данные из вызова $http, которые будут доступны через .then @OamPsy. - person tymeJV; 03.02.2016
comment
Спасибо за объяснение, {{isLoggedIn}} по-прежнему отображается как true в html, когда console.log этого имеет значение false - person Oam Psy; 03.02.2016
comment
Где вы это регистрируете? Служба возвращает false? - person tymeJV; 03.02.2016