ajax-запрос Ember, проходящий через компонент

я просто хочу получить значение из запроса json в сервисах ember из компонента. это мой код

forecast-weather.js (услуги)

import Ember from 'ember';  
    export default Ember.Service.extend({
      findWeatherCurrent:function (lat,lng) {
        return Ember.$.getJSON('https://api.darksky.net/forecast/22b106924ed7e3bcde76608f7f064585/'+ lat +','+lng+'?exclude=minutely,hourly,daily,flags&units=si');
      },
      findWeatherDaily:function (lat,lng) {
        return Ember.$.getJSON('https://api.darksky.net/forecast/22b106924ed7e3bcde76608f7f064585/'+ lat +','+lng+'?exclude=minutely,hourly,currently,flags&units=si');
      },
      findWeatherHourly:function (lat,lng) {
        return Ember.$.getJSON('https://api.darksky.net/forecast/22b106924ed7e3bcde76608f7f064585/'+ lat +','+lng+'?exclude=minutely,daily,currently,flags&units=si');
      }
    });

weather-display.js (компонент)

import Ember from 'ember';

export default Ember.Component.extend({
  forecastWeather:Ember.inject.service(),
  willRender(){
    let lat = this.get('lat');
    let lng = this.get('lng');
    this.get('forecastWeather').findWeatherCurrent(lat,lng).then(data => {
      this.set('currents', data);
      console.log(data);
    });
  }
});

ответ json

{

    "latitude": 37.8267,
    "longitude": -122.4233,
    "timezone": "America/Los_Angeles",
    "offset": -7,
    "currently": {
        "time": 1489488513,
        "summary": "Clear",
        "icon": "clear-night",
        "nearestStormDistance": 47,
        "nearestStormBearing": 87,
        "precipIntensity": 0,
        "precipProbability": 0,
        "temperature": 13.54,
        "apparentTemperature": 13.54,
        "dewPoint": 8.59,
        "humidity": 0.72,
        "windSpeed": 0.87,
        "windBearing": 46,
        "visibility": 12.46,
        "cloudCover": 0.08,
        "pressure": 1016.58,
        "ozone": 279.62
    }

}

weather-display.hbs

<p id="word_on_change" class="font_black font-white word">{{currents.currently.windSpeed}}</p>

я просто хочу передать это значение скорости ветра из json в шаблон hbs, но это не работает. может кто решит это :(


person cahyowhy    schedule 14.03.2017    source источник


Ответы (1)


Чтобы обработать результат $.getJSON, важно знать версию jQuery. Одним из наиболее важных изменений в jQuery 3 является то, что jQuery .Deferred теперь совместим с Promises/A+.

Вероятно, вы используете версию jQuery до 3.0, а это значит, что вам нужно преобразовать Deferred в Promise, что можно сделать с Ember.RSVP.resolve().

Однако это не ваша проблема!

твоя реальная проблема

Сначала я создал твиддл с ваш код. Подумайте о том, чтобы сделать это самостоятельно в следующий раз ;-). Там вы видите ошибку в консоли:

XMLHttpRequest не может загрузить https://api.darksky.net/forecast/22b106924ed7e3bcde76608f7f064585/46.9483,7.4515?exclude=minutely,hourly,daily,flags&units=si. В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, Origin 'null' не имеет доступа.

Это связано с тем, что darksky отключил CORS для своего API. Это означает, что вы не можете напрямую обращаться к API из браузерного JavaScript.

Вы должны запросить свой собственный веб-сервер, который затем может выполнить запрос к API darksky.

проверьте ссылки на CORS.

Но запрос возвращает 200 OK в инструментах разработки или в отладчике HTTP.

Да. Вот как работает CORS. Приложение успешно возвращает данные в браузер, но из-за отсутствия заголовков CORS браузер не разрешает вашему веб-сайту получить доступ к ответу. Это важная функция безопасности.

person Lux    schedule 14.03.2017
comment
как убедиться в версии jquery? Он был написан на bower.json в предыдущих версиях ember. - person ykaragol; 14.03.2017
comment
Версия теперь указана внутри самого ember-source. - person Lux; 14.03.2017