Сделайте область видимости внутри функции глобальной - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь получить доступ к своему $ rootScope.newBloodneeded, но я не могу получить доступ к нему вне функции, я попытался получить rootcope, чтобы я мог назвать его глобальным, но все равно он дает мне неопределенное значение

.controller('editbloodrequestCtrl', function($scope,Bloodrequest,$rootScope,$routeParams) {
$rootScope.newBloodneeded;

Bloodrequest.getBloodrequest($routeParams.id).then(function(data) {
        if (data.data.success) {
            $scope.newBloodneeded = data.data.bloodrequest.blood_component;
            $rootScope.newBloodneeded = $scope.newBloodneeded;
            //gives me output when I console here
        } else {
            app.errorMsg = data.data.message; // Set error message
        }
    });

console.log($rootScope.newBloodneeded); //gives me undefined

}

1 Ответ

0 голосов
/ 15 марта 2019

Предполагая, что $ rootScope работает правильно, это проблема асинхронности, а не области действия - при попытке запустить:

console.log($rootScope.newBloodneeded); //gives me undefined

...getBloodRequest не обязательно завершено.Вы устанавливаете $rootScope.newBloodneeded в then, который запускается ТОЛЬКО после разрешения getBloodRequest, что может быть далеко, далеко после завершения журнала консоли.

Bloodrequest.getBloodrequest($routeParams.id).then(function(data) {
            ...
            $rootScope.newBloodneeded = $scope.newBloodneeded;
            ...

Один забавный тест, который вы можете попробовать, эточтобы обернуть консольный журнал в setTimeout на долгое время (когда вы гарантированно / уверены, что getBloodRequest закончен).Это должно доказать вам, что проблема заключается во времени, а не в определении области действия.

В основном:

setTimeout(() => console.log($rootScope.newBloodneeded), 10000000000) // or whatever timing guarantees completion

Решение здесь также состоит в том, чтобы объединить в цепочку любую логику, которая требует $rootScope.newBloodneeded в .then.Если ЭТО не работает, вы можете создать Обещание, к которому у вас есть доступ из других мест.(Это выходит за рамки этого вопроса, и нам нужно больше подробностей, чтобы определить наилучшую реализацию).

...