2016-05-25 28 views
1

我想从服务中的方法访问数据,该方法返回我用来发出HTTP请求的坐标。我在我的控制器中添加了我的Leaflet代码,这样我就可以访问lat,lng坐标来向另一个API发出API请求。一切正常。问题是当我尝试将这些数据传递给控制器​​时,它不读取属性“L.Control.Search”。我也试图编写一个数组并在控制器中访问它,并返回undefined。使用方法从角度服务访问数据

app.service('mapService', (function($http,$q) { 
    //Coordinates 
    var fmCoordinates = {}; 
    //Function to Request markets 
    var requestMarkets = function(lat,lng){ 
     var defer = $q.defer(); 
     var dataFromHttp = {}; 
     var options = { 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      url: "http://someurl?lat=" + lat + "&lng=" + lng 
     }; 
     $http(options).then(function(result) { 
     dataFromHttp = result.data; 
     defer.resolve(dataFromHttp); 
    }, function(error){ 
     defer.reject(error); 
    }); 
    return defer.promise; 
    }; 


L.Control.Search = L.Control.extend({ 

_getLocation: function(key) { //extract latlng from _recordsCache 

     var latLong = this._recordsCache[key]; 
     console.log("This is latlong:\n"+Object.keys(latLong)); 
     fmCoordinates.lat = latLong.lat; 
     fmCoordinates.lng = latLong.lng; 
     console.log(fmCoordinates.lat,fmCoordinates.lng || "Nothing yet!"); 
     var promise = requestMarkets(fmCoordinates.lat,fmCoordinates.lng); 
     promise.then(function(greeting) { 
      for(var property in greeting.results) { 
       console.log(property + "=" + greeting.results[property]); 
       }; 
      console.log('Success: ' + greeting.results); 
      }, function(reason) { 
      console.log('Failed: ' + reason); 
      }); 
     if(this._recordsCache.hasOwnProperty(key)) 
      return latLong;//then after use .loc attribute 
     else 
      return false; 
    }, 

L.Map.addInitHook(function() { 
    if (this.options.searchControl) { 
     this.searchControl = L.control.search(this.options.searchControl); 
     this.addControl(this.searchControl); 
    } 
}); 

L.control.search = function (options) { 
    return new L.Control.Search(options); 
}; 

})); 
+0

你在哪里回报什么?您只能访问您在服务中返回的数据。 –

+0

好吧,我明白了。现在在我的控制器中,我想调用mapService.requestMarkets,但requestMarkets在_getLocation()中调用。我仍然无法访问该函数,因为它位于我的控制器不识别的L.Control.Search中。 – Roscoe

+0

例如,您可以返回L.Control.Search。 'return {search:L.Control.Search,requestMarkets:requestMarkets}',然后在你的控制器中只需要'mapService.search()' –

回答

1

我认为您的承诺代码略微关闭。尝试将其更改为以下内容。在承诺解决之前,你现在回来了。

var requestMarkets = function(lat,lng){ 
    var defer = $q.defer(); 
    var dataFromHttp = {}; 
    var options = { 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: "http://someurl?lat=" + lat + "&lng=" + lng 
    }; 
    return $http(options).then(function(result) { 
     dataFromHttp = result.data; 
     defer.resolve(dataFromHttp); 
     return defer.promise; 
    }, function(error){ 
     defer.reject(error); 
     return defer.promise; 
    }); 

}; 

同样在一个地方你有l.Control.Search和L.control.search在另一个地方。

+0

你在_getLocation中使用的承诺有类似的问题。在then()函数之后放置的任何代码将立即运行,而不是在then函数完成之后运行。 (这实际上是你问题的原因,但我认为你明白了。) –

+0

为什么'返回defer.promise'?对我来说,在成功或错误回调函数结束时返回一些值是没有意义的。 –

+0

恩,你有原始代码返回defer.promise。我只是把它移到适当的地方。无论如何,您正在通过函数中的承诺进行调用,并且从函数返回值,并期望承诺已完成,而您不能这么做。另外,我更新了答案以反映一些案例问题。 –