2013-03-17 3 views
0

Я не могу получить доступ к массиву в контроллере AngularJS, но он работает в представлении.

В контроллере: .results возвращает неопределенное

function TwitterCtrl($scope, $resource){ 

    $scope.twitter = $resource('http://search.twitter.com/:action', 
     {action:'search.json', q:'angularjs', callback:'JSON_CALLBACK'}, 
     {get:{method:'JSONP', params: {rpp: 4}}}); 

    $scope.twitterResult = $scope.twitter.get({q:"example"}); 

    //returns the resource object 
    console.log($scope.twitterResult) 

    //returns undefined 
    console.log($scope.twitterResult.results); 
} 

В представлении: .results возвращает массив твитов

//This returns an array of tweets 
{{$scope.twitterResult.results}} 
+0

См. Также http://stackoverflow.com/questions/14373661/angularjs-data-assignment –

+0

Спасибо. Этот пост описывает то, что я пытался достичь. Я поместил весь свой код в обратный вызов 'success', чтобы использовать массив' results'. Мне хотелось бы назначить массив переменной и получить доступ к ней за пределами этой функции. – Dru

+0

Вы можете сделать это - например, $ scope.twitterResult = $ scope.twitter.get (...) '- если вы также добавляете' $ watch ('twitterResult', function (newValue) {.. .}) ', чтобы обнаружить, когда он получает асинхронное обновление. –

ответ

5

$ ресурсных вызовы являются асинхронными, но $ службы ресурса возвращает пустой объект для resource.get вызывает вызовы немедленно при вызове (или пустой массив на вызовы resource.query). Затем, только после того, как обещание будет разрешено (сервер возвращает ответ), служба $ resource присваивает фактические результаты переменной $scope.twitterResult.

Именно поэтому $scope.twitterResult пуст при непосредственном доступе (console.log), но (по-видимому) «работает» на ваш взгляд.

Ваше выражение вида {{$scope.twitterResult.results}} также не определено сначала, но служба разбора углов $ (отвечающая за выражения выражения синтаксического анализа) не выводит undefined, потому что она предназначена не для. После получения ответа сервера выражение вида обновляется и отображаются twitterResult.results.

+0

'$ scope.twitterResult' не пуст при использовании' console.log' в контроллере. Он возвращает объект ресурса. Я могу увидеть массив 'results', который я хочу получить, когда он зарегистрирован. Тем не менее, я получаю 'undefined', когда я использую' $ scope.twitterResult.results' в контроллере. – Dru

+0

@Dru, к тому времени, когда вы вручную нажмете массив 'twitterResult' в консоли,' results' были заполнены (асинхронно). Так работает Chrome. Если вы вместо этого запишите 'console.log (JSON.stringify ($ scope.twitterResult))', вы увидите, что 'results' не заполняются во время выполнения этого оператора. –