2013-09-23 14 views
9

Próbuję uzyskać dwie listy 2 postów na blogu z 2 kategorii (wiadomości i wydarzenia), a następnie wyświetlić je w 2 różnych kolumnach mojej strony głównej. Wymagane jest ode mnie wykonanie dwóch oddzielnych wywołań Ajax, aby uzyskać te posty na blogu. Nie używam danych ember dla tej operacji, ponieważ nie widzę korzyści z używania go w tym scenariuszu (ale mogę się mylić).Ember.js: wiele wywołań Ajax na jednej trasie

export default Ember.Route.extend({ 
    setupController(controller, model) { 
    var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category='; 

    Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }).then(function (data) { 
     controller.set('news', data.posts); 
    }); 
    Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }).then(function (data) { 
     controller.set('events', data.posts); 
    }); 
    } 
}); 

Powyższy kod działa. Ale z tego, co przeczytałem w Dokumentacji Ember, powinienem dostać te dane w haku model (zamiast setupController), aby skorzystać z obietnic. Więc starałem się ponownie napisać kod w ten sposób:

export default Ember.Route.extend({ 
    model() { 
    var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category='; 

    return { 
     news: function() { 
     return Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }).then(function (data) { 
      return data.posts; 
     }) 
     }, 
     events: function() { 
     return Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }).then(function (data) { 
      return data.posts; 
     }) 
     } 
    }; 
    } 
}); 

Ale to nie działa. Wywołania Ajax są wykonywane, ale jest za późno, po wyrenderowaniu strony. Nie jestem pewien, co robię źle. Czy istnieje jakaś korzyść z używania danych ember dla tego scenariusza?

Odpowiedz

11

Można zwrócić hash obietnic z RSVP.hash()

Można to zrobić:

export default Ember.Route.extend({ 
    model() { 
     var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category='; 

     return new Ember.RSVP.hash({ 
      news: Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }), 
      events: Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }) 
     }); 
    } 
}); 

Więcej o obietnicach w Ember here

+1

+1 dla RSVP.hash(). Doskonała odpowiedź, dokładnie to, czego potrzebowałem - dziękuję! – rog

3

Zwracasz obiekt zawierający dwie obietnice, a nie rzeczywistą obietnicę. Potrzebne jest zbudowanie własnej obietnicy (Ember.RSVP.Promise), która zostanie rozwiązana, gdy obie obietnice wewnętrzne zostaną rozwiązane.

+0

Dzięki za odpowiedź. Rozumiem, że powinienem mieć tylko jedną obietnicę, ale nie wiem, co wtedy robiłaby moja funkcja resolve() ... czy powinienem łączyć połączenia Ajax czy coś takiego? – Pedro

+1

Nie ma potrzeby łączenia. Przy każdym oddzwanianiu sukcesu sprawdź, czy druga obietnica już została rozwiązana. Jeśli tak, rozwiąż obietnicę zewnętrzną. –

Powiązane problemy