2015-06-04 2 views
0

У меня есть фабрика, где я пытаюсь получить данные по сервису $ http.Angularjs, получение данных с фабрики

фабрика:

(function(){ 
angular 
.module('projectApp') 
.factory('weatherfactory', weatherfactory); 

weatherfactory.$inject=['$http']; 

function weatherfactory($http){ 
var cities=[ 
    {name: "Łódź", link: "http://api.openweathermap.org/data/2.5/weather?q=Lodz,pl"}, 
    {name: "Warszawa", link: "http://api.openweathermap.org/data/2.5/weather?q=Warszawa,pl"} 

]; 
var weat={}; 

var service={ 
    getCities: getCities, 
    GetWeather: _GetWeather 
}; 
return service; 

function _GetWeather(link){ 
    $http.get(link).success(function(data){ 
    weat=data; 
    }); 
    return weat; 
} 


function getCities(){ 
    return cities; 
} 

} })();

В контроллере я вызвать функцию от завода:

function weatherData(city){ 
    sa.weather=weatherfactory.GetWeather(city); 
    sa.show=true; 
} 

Вид:

<div class="row"> 
    <div class="col-md-8"> 
     <select class="form-control" ng-model="sa.city"> 
     <option ng-repeat="city in sa.cities" value="{{city.link}}">{{city.name}}</option> 
     </select> 
    </div> 
    <div class="col-md-4"> 
     <button class="btn btn-primary" ng-click="sa.weatherData(sa.city)">Wybierz</button> 
    </div> 
    <div ng-if="sa.show"> 
     {{sa.weather.name}} 
    </div> 
    </div> 

Это работает, но не правильно. Я должен дважды щелкнуть кнопку, чтобы отобразить правильные данные.

ответ

1

Когда вы делаете запрос на сервер, вам нужно подождать, пока в функции обратного вызова не появится ответ.

В вашем коде вы сразу же возвращаетесь из функции GetWeather, поэтому weat пуст в первый раз. Когда вы нажмете кнопку второй раз, информация о погоде будет доступна к тому времени, чтобы вы могли видеть информацию о погоде.

Вы должны внести следующие изменения в свой код.

изменения Услуги

function _GetWeather(link){ 
    return $http.get(link); 
} 

изменения Контроллер

function weatherData(city){ 
    weatherfactory.GetWeather(city).success(function (data) { 
     sa.weather = data; 
     sa.show = true; 
    }); 
} 
Смежные вопросы