Задать вопрос
@alex_adept

Как получить доступ к данным из $hhtp.get() в angularJS?

Здравствуйте. Суть проблемы:

<div class="ng-scope" ng-init="init_func()" ng-controller="testCtrl">


var testApp = angular.module('testApp', []);
testApp.controller("testCtrl", ['$http', function($http){
        var store = this;
        store.init_func = function(){
                $http.get('/get_json_data')
                        .success(function(data){
                                store.my_data = data;
                        })        
        };
        console.log(store);
        console.log(store.my_data);
}]);

Выводв консоль:
Object { init_func=function()}
undefined

В варианте со scope аналогиченая ситуация:
var testApp = angular.module('testApp', []);
testApp.controller("testCtrl", ['$scope', '$http', function($scope, $http){
        $scope.init_func = function(){
                $http.get('/get_json_data')
                        .success(function(data){
                                $scope.my_data = data;
                        })        
        };
        console.log($scope);
        console.log($scope.my_data);
}]);

Вывод:
l { $$listeners={...}, $$listenerCount={...}, $id=2, ещё...}
undefined


Данные получает корректно, со страницы доступ есть. Console.log($scope.my_data); внутри колбека отрабатывает правильно.

Прошу объяснить что я не понимаю, и каким образом получить доступ к данным, полученным через $http.get() из контроллера?
  • Вопрос задан
  • 410 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
keksmen
@keksmen
Just a programmer
Вы, видимо, не совсем правильно поняли принцип работы ajax запросов.
Синхронные запросы - зло для производительности, посему в Angular используют механизм, похожий на Promises.
Соответственно, сразу данные не придут и в консоль не будет выведено ничего корректного.

Суть в том, что за запрос уходит определенное время и callback вызывается только по его завершении.

Грубо говоря, внутри callback'а, после проведенных операций, вам нужно вызвать scope.$apply(), чтобы применить изменения модели и уже тогда можете быть уверены, что данные пришли.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@ilov3
Учу питон и джангу потому что модно
Вам нужно вызвать store.init_func.
Попробуйте так:
var testApp = angular.module('testApp', []);
testApp.controller("testCtrl", ['$http', function($http){
        var store = this;
        store.init_func = function(){
                $http.get('/get_json_data')
                        .success(function(data){
                                store.my_data = data;
                        })        
        };
        store.init_func();
        console.log(store);
        console.log(store.my_data);
}]);
Ответ написан
$scope.$watch 'my_data', (data) ->
    console.log($scope)
    console.log($scope.my_data)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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