AngularJS: Как получить доступ к переменной внутри обещания и использовать внутри контроллера?

0

Я пытаюсь объявить массив внутри функции контроллера, которая происходит после того, как завод извлекает данные, а затем получает доступ к ней после завершения выполнения функции. Вот что у меня для моего кода:

app.controller('SignUpController', function ($scope, $http, $location, DailyCounterService, $localStorage) {

    DailyCounterService.GetDailyCountersList().then(function (d) {
        $scope.DailyCounters = d.data;
        $scope.allCounters = [];

        var daySixteen = d.data.filter(function (d) {
            // This is where I'm building the array I want to access later
            $scope.allCounters.push(d.MICounter);

            return d.MIDay === "16";
        });

        console.log($scope.allCounters);
        // This prints in console '[2, 6, 1, 1, 7, 8, 2......]'
        // So the array is now initialized

    }, function (error) {
        alert('Error!');
    });

    // Here is where I want to access $scope.allCounters once again
    // But Can't because doing this:
    console.log($scope.allCounters);
    // prints 'undefined'
    // How would I make $scope.allCounters be able to be accessed here?
})
.factory('DailyCounterService', function ($http) {
    var fac = {};
    fac.GetDailyCountersList = function () {
        return $http.get('/Data/GetDailyCountersList')
    }
    return fac;
})

Как я спросил в комментариях к концу моего контроллера, как бы я мог получить доступ к переменной, установленной в функции ранее вне этой функции?

  • 0
    Если вы хотите использовать $ scope.allCounters при инициализации вашего контроллера, вам нужно будет использовать его в методе .then (), так как это единственный раз, когда он будет доступен во время инициализации.
  • 0
    @jbrown есть ли вообще в моих текущих настройках, где я могу сделать эти данные доступными вне функции .then() ? Какой-нибудь способ обхода локального хранилища?
Показать ещё 5 комментариев
Теги:
scope
variables
local-storage
angularjs-scope

1 ответ

1
Лучший ответ

Ну, если этот контроллер связан с маршрутом, то вы можете связать этот код get в атрибуте разрешения поставщика маршрутов, как это,

.when("/signup", {
    templateUrl: "signup.html",
    controller: "SignUpController",
    resolve: {
        allCounters: 
        function(DailyCounterService){
            DailyCounterService.GetDailyCountersList().then(function (d) {
             // Do your stuff
             return allCounters;
        }, function (error) {
             alert('Error!');
         });
        }
    } 
}),

и доступ к allCounters в вашем контроллере, как это,

 app.controller('SignUpController', function ($scope, $http, $location, allCounters, DailyCounterService, $localStorage)

Таким образом, все счетчики всегда будут инициализированы при загрузке вашего контроллера.

Подробнее о решении: http://odetocode.com/blogs/scott/archive/2014/05/20/using-resolve-in-angularjs-routes.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню