2014-12-11 2 views
-1

Мне сложно понять, почему контроллер не может видеть мою фабрику. Любые идеи о том, что я делаю неправильно?AngularJS не может распознать Factory

Мой контроллер:

myApp.controller('SNFController', ['$scope', '$http', '$routeParams', '$location', 'foundSnfs', 
function($scope, $http, $routeParams, $location, foundSnfs) { 
    $scope.snfs = null; 
    $scope.chosensnf = []; 
    $scope.hidefilter = true; 
    $scope.getlocale = function() { 
     foundSnfs.getsnfs($scope.zip, $scope.miles).then(function(res){ 
     $scope.snfs = res; 
    }) 
}]) 

Моя фабрика:

myApp.factory('foundSnfs', function($http) { 
    var foundSnfs = {}; 
    foundSnfs.getsnfs = function (vz, vm){ 
     var g = new google.maps.Geocoder(); 
     g.geocode({ 'address': vz}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       var la = results[0].geometry.location.lat(); 
       var lo = results[0].geometry.location.lng(); 
       var cl = new google.maps.LatLng(la, lo); 
       var dm = vm * 1609.34; // distance in miles from meters 
       var url = 'http://data.medicare.gov/resource/hq9i-23gr.json?$where=within_circle(location,'+la+','+lo+','+dm+')&$ORDER=overall_rating DESC'; 
       return $http.get(url); 
      } 
     }) 
    } 
}); 

У меня есть 2 поля ввода, один с почтовым индексом, а другой с диапазоном пробега. Когда пользователь нажимает кнопку, $ scope.locale должен передать zip и мили на фабрику, которая затем обрабатывает геолокацию, а затем получает список домов престарелых от Medicare.

спасибо.

+0

Как вы знаете, что это не работает? – Phil

+0

Я бы сказал, что основная проблема заключается в том, что ваша фабричная функция не возвращает обещание. – Phil

ответ

1

Итак, основная проблема, которую я вижу, заключается в том, что g.geocode является асинхронным, поэтому вам нужно будет создать отложенный объект и вернуть обещание. Вот пример ...

myApp.factory('foundSnfs', function($q, $http) { 
    var foundSnfs = {}; 
    foundSnfs.getsnfs = function (vz, vm){ 
     var deferred = $q.defer(); 
     var g = new google.maps.Geocoder(); 
     g.geocode({ 'address': vz}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       var la = results[0].geometry.location.lat(); 
       var lo = results[0].geometry.location.lng(); 
       var cl = new google.maps.LatLng(la, lo); 
       var dm = vm * 1609.34; // distance in miles from meters 
       var url = 'http://data.medicare.gov/resource/hq9i-23gr.json?$where=within_circle(location,'+la+','+lo+','+dm+')&$ORDER=overall_rating DESC'; 

       // you can resolve a deferred object with another promise 
       // which will resolve or reject appropriately. 
       deferred.resolve($http.get(url)); 
      } else { 
       deferred.reject(status); 
      } 
     }); 

     return deferred.promise; 
    } 

    return foundSnfs; // as eugene pointed out, you missed this 
}); 

Вот пример того, как можно разрешить или отклонить отложенные объекты с дальнейшими обещаниями (как $http)

JSFiddle

+0

Вот и все! Я был повесил трубку на неопределенное сообщение об ошибке. Спасибо!! – user2690440

2

AngularJs завод ожидает возвращаемое значения. Factory

myApp.factory('foundSnfs', function($http) { 
var foundSnfs = {}; 
foundSnfs.getsnfs = function (vz, vm){ 
    var g = new google.maps.Geocoder(); 
    g.geocode({ 'address': vz}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      var la = results[0].geometry.location.lat(); 
      var lo = results[0].geometry.location.lng(); 
      var cl = new google.maps.LatLng(la, lo); 
      var dm = vm * 1609.34; // distance in miles from meters 
      var url = 'http://data.medicare.gov/resource/hq9i-23gr.json?$where=within_circle(location,'+la+','+lo+','+dm+')&$ORDER=overall_rating DESC'; 
      return $http.get(url); 
     } 
    }) 
} 
// factory needs to return 
return foundSnfs; 
}); 

Кроме того, если g.geocode является асинхронной, вы можете захотеть использовать $q

+0

Ах, большой улов! Я был настолько сосредоточен на асинхронном геокодировании, что я полностью упустил тот факт, что завод ничего не возвращал. +1 – Phil

Смежные вопросы