0

У меня есть контроллер и сервис.Угловая область не обновляется после сервисного вызова

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

Однако в контроллере он принимает true или false правильно, но 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(), и я продолжаю получать ошибку цикла дайджеста в процессе. Помогите!!!

+2

Вы используете 'isLoggedIn' и' userModel' в сервисе, подобно методам ... что вы передаете в службу? – tymeJV

+0

@tymeJV - im, ничего не передавая службе. –

+2

'getData' определяется двумя параметрами, вы передаете один аргумент (анонимная функция). И 'userModel' в обратном вызове' $ http.get' будет 'undefined', так как вы не передали второй аргумент, поэтому' userModel (data); 'должен вызывать ошибку, вы проверили консоль? –

ответ

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}; 
        }      
       }); 
     } 
    } 
}); 
+0

Спасибо, что имеет смысл, есть 3 уровня возврата в реорганизованной версии, все ли нужно? Просто пытаюсь понять это немного больше. –

+1

Да ... так что первый «возврат» - это всего лишь ваш объект со всеми вашими вызовами в качестве функций. Второй 'return' возвращает все обещание' $ http', а третий возвращает данные из вызова '$ http' для доступа через' .then' @OamPsy – tymeJV

+0

Спасибо за объяснение, {{isLoggedIn}} по-прежнему отображается как true в html, когда console.log имеет значение false –

 Смежные вопросы

  • Нет связанных вопросов^_^