Данные Angular $resource доступны для просмотра, но не в коде.

Я угловой нуб и очень разочарован конкретной проблемой.

У меня есть ресурс $resource, возвращающий данные с сервера, который содержит пары ключ/значение, т.е. detail.name, detail.email и т. д.

Я могу получить доступ к этой информации в представлении, используя нотацию {{detail.name}}, но я не могу получить к ней доступ в коде, что сводит меня с ума, так как мне нужны эти данные для работы.

Как я могу получить к нему доступ в бэкэнде?

вот код, генерирующий данные:

mydata = Appointment.get({id: $stateParams.id}, function(data){
    geocoder.geocode(data);
    $scope.detail = data;
});

на представлении у меня есть следующее:

<address class="text-left"> 
                {{detail.address_1}}</br>
                {{detail.city}}</br>
                {{detail.postcode}}</br>
                </address>
        </hr>       
        <p> {{detail.lat}}</p>
        <p> {{detail.lng}}</p>
        <p> {{center}}</p>

это все в порядке.

однако, если я добавлю console.log($scope.detail.lat) в обратный вызов $resource, я получу неопределенность.

Вот определение ресурса:

angular.module('MyApp')
.factory('Appointment', function($resource){
    return $resource('/api/admin/:id', { id: "@_id" }, {
         query: {method:'GET', isArray:true}, 
         update: { method:'PUT' }
    });
})

и фабрика геокодера, если кому интересно:

angular.module('MyApp')
.factory('geocoder', ['$http','$state', function($http, $state){

var geocoder ={};

geocoder.geocode = function (formData){
    var myformData = {};
    var address = formData.address_1+', '+formData.city+', '+formData.postcode;

                var key = 'AIzaSyACVwB4i_6ujTrdjTMI-_tnsDrf6yOfssw';

                $http.get('https://maps.googleapis.com/maps/api/geocode/json?address='+address+'&key='+key).
                  success(function(results, status, headers, config) {
                    var results = results.results[0];
                    formData.lat = results.geometry.location.lat;
                    formData.lng = results.geometry.location.lng;
                        myformData = formData;
                    return myformData;          

                     // this callback will be called asynchronously
                    // when the response is available
                  }).
                  error(function(results, status, headers, config) {
                    // called asynchronously if an error occurs
                    // or server returns response with an error status.
                  });   
}


return geocoder;

}])

Кто-нибудь может помочь?


person Mobaz    schedule 04.05.2015    source источник
comment
фабрика геокодера настроена неправильно.... должна возвращать обещание $http и использовать разрешение обещания then() для установки данных. Очень нужно понять, что означает asynchronous, и глубоко изучить ссылку, которую я дал в вашем последнем вопросе.   -  person charlietfl    schedule 04.05.2015


Ответы (1)


Вы можете использовать обещание, возвращаемое объектом $resource, а затем использовать это обещание в контроллере.

Фабрика

angular.module('MyApp')
.factory('Appointment', function($resource){
    return $resource('/api/admin/:id', { id: "@_id" }, {
         query: {method:'GET', isArray:true}, 
         update: { method:'PUT' }
    });
})

Контроллер

mydata = Appointment.get({id: $stateParams.id}).$promise;
mydata.then(function(data){
    geocoder.geocode(data);
    $scope.detail = data;
});
person Pankaj Parkar    schedule 04.05.2015
comment
@Mobaz тебе помогло? - person Pankaj Parkar; 06.06.2015