2015-07-31 1 views
0

У меня есть следующий контроллер.

spaModule.controller("galleryController", function($http, $scope) { 
    var test; 
    $http.get("resources/php/gallery.php").success(function(response){ 
     test = response; 
    }); 
    console.log(test); 
}); 

Этот контроллер отправляет запрос GET к PHP-файл, который возвращает некоторые JSON, содержащий имена файлов всех изображений, которые я в определенной директории. Я знаю, что, вероятно, я должен использовать эту услугу, но я буду использовать эту информацию только в одном контроллере, поэтому я бы просто сохранил ее в этом контроллере.

Мне нужно получить данные ответа из анонимной функции в область действия контроллера, чтобы я мог создать директиву галереи с данными JSON.

Код, который я добавил к этому вопросу, был моей попыткой сделать это. Я думаю, что моя проблема может заключаться в том, что функция .success имеет свою собственную область или, возможно, объект $ http, поэтому я вхожу в «вложенную» область. То есть мне нужно вывести JSON из области анонимной функции в область .success/$ http, а затем из этой области в область действия контроллера. Я не уверен, что это моя проблема, или если это так.

Как получить свой ответ JSON в область моего контроллера?

ответ

2

Просто назначьте его $scope. Локальные переменные var никогда не были угловыми «областями», внутри или вне обратных вызовов.

$http.get("resources/php/gallery.php").success(function(response){ 
    $scope.test = response; 
}); 

Если вы имеете в виду, что вы хотите постобработку данных, что вам нужно сделать, что внутри success обратного вызова. Из-за того, что операция является асинхронной, часть console.log в вашем примере никогда не сможет получить доступ к этим данным.

$http.get("resources/php/gallery.php").success(function(response){ 
    // do whatever you need to do here 
    var data = response.map(..); 
    // then assign to $scope: 
    $scope.data = data; 
}); 
+0

Я просто говорил о сфере видимости переменной JavaScript, а не об объекте $ scope. Хотя у меня есть вопрос. Я уже пробовал это раньше, но решил, что это не сработает. Я думал, что, потому что я пытался посмотреть на такие данные: 'console.log ($ scope.test);'. Это возвращает «undefined» в консоли, но я могу называть '{{test}}' на странице без проблем. Почему это? – Allenph

+0

** Асинхронное выполнение. ** Время, когда вы вызываете 'console.log' и время, когда' $ scope.test' фактически назначено, - это наоборот, чем вы думаете. – deceze

+0

Хм. Я планировал использовать эти данные в директиве ng-repeat на внешней странице. Если я понимаю, что вы говорите, я не буду в типичном хронологическом порядке команд. Этот 'console.log' вызывается до того, как запрос AJAX будет полностью обработан. Если это правда, у меня могут быть проблемы с моей директивой, не так ли? – Allenph

0

Вы можете хранить данные в получаемые помехи Вашей области при необходимости:

spaModule.controller("galleryController", function($http, $scope) { 
    $http.get("resources/php/gallery.php").success(function(response){ 
     $scope.data = response; 
    }); 
}); 

Но это возможно, только должно быть сделано, если данные не большого размера. В противном случае вы должны хранить его где-нибудь еще, а процесс его и только установленные значения, требуемые в пользовательском интерфейсе на $ объеме

+1

Почему мне нужно беспокоиться о размере данных? – Allenph

0
spaModule.controller("galleryController", function($http, $scope) { 
    $scope.test; 
    $http.get("resources/php/gallery.php") 
     .success(function(response){ 
      $scope.test = response; 
     }) 
     .then(function() { 
      // $scope.test is set 
     }); 
    // $scope.test is not set yet due to the async $http.get function 
}); 

Здесь вы можете установить $ scope.test внутри функции успеха. Угловое будет замечено, что область обновления обновлена ​​и выполняет работу за вас. Таким образом, вы сможете использовать $ scope.test в другом месте внутри вашего кода. Будьте осторожны с функцией async.

Надеюсь, этот ответ на ваш вопрос.

-1

Вы забыли вводить зависимостей в контроллере

Пожалуйста, измените код контроллера фрагмент кода, как показано ниже

spaModule.controller("galleryController", ['$scope','$http',function($scope,$http) { 
var test; 
$http.get("resources/php/gallery.php").success(function(response){ 
    test = response; 
}); 
console.log(test); 

}]);