Добрый день, Друзья!
У меня эта задача всегда превращается в проблему. У меня input, при вводе я хочу показывать в выпадющем списке данные из двух источников. Первый источник берется у меня из базы, второй источник это адреса из яндекс карт (Yandex autocomplete).
Я написал код который берет текс и ищет из двух источников. С первым источником никаких проблем нет, а второй это запрос на яндекс карты.
Тут есть пример который вызывает angular http и возвращает массив. Вот он:
<h4>Asynchronous results</h4>
<pre>Model: {{asyncSelected | json}}</pre>
<input type="text" ng-model="asyncSelected" placeholder="Locations loaded via $http" uib-typeahead="address for address in getLocation($viewValue)" typeahead-loading="loadingLocations" typeahead-no-results="noResults" class="form-control">
<i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>
<div ng-show="noResults">
<i class="glyphicon glyphicon-remove"></i> No Results Found
</div>
// Any function returning a promise object can be used to load values asynchronously
$scope.getLocation = function(val) {
return $http.get('//maps.googleapis.com/maps/api/geocode/json', {
params: {
address: val,
sensor: false
}
}).then(function(response){
return response.data.results.map(function(item){
return item.formatted_address;
});
});
};
В первый раз я сделал точно также, но в результат я получал не просто массив а промис, а сам массив был уже внутри нее.
В итоге я написал следующий код, который все таки возвращает пустой массив. В логах видно что с начало возвращается пустой массив, а только после этого вызывается функция getLocations.
$scope.getTarifZones = function(val) {
var result = [];
var getLocations = function(value) {
return $http.get('/api/locations', {
params: {
address: 'Казахстан, Алматы, '+value
}
}).then(function(response){
var featureMember = response.data.response.GeoObjectCollection.featureMember;
featureMember.map(function(item){
return {
place: item.GeoObject.name,
type: 'Адреса'
};
});
var zones = _.filter($scope.order.client.places, function (place) {
return place.place.address.indexOf(val) >=0;
}).map(function (place) {
place.place.type = 'Тарифные зоны';
return place;
});
result = _.concat(zones, featureMember);
console.log('locations ', result);
});
};
getLocations(val);
return result;
};