2013-05-19 25 views
6

Próbuję wygenerować adres URL Flickr na podstawie wywołania interfejsu API Flickr, a następnie zwrócić ten wynik do szablonu handlebars.js. Staram się znaleźć sposób na asynchroniczne procesy.Meteor - powrót funkcji asynchronicznej do szablonu kierownicy?

Próbowałem utworzyć funkcję wywołania zwrotnego, ale nadal nie jestem pewien, jak uzyskać zdefiniowany obiekt lub zmienną w szablonie HTML.

Oto kod dla funkcji Flickr API:

var FlickrRandomPhotoFromSet = function(setID,callback){ 
Meteor.http.call("GET","http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key="+apiKey+"&photoset_id="+setID+"&format=json&nojsoncallback=1",function (error, result) { 
    if (result.statusCode === 200) 
    var photoResult = JSON.parse(result.content); 
    var photoCount = photoResult.photoset.total; 
    var randomPhoto = Math.floor((Math.random()*photoCount)+1); 
    var selectedPhoto = photoResult.photoset.photo[randomPhoto]; 
    var imageURL = "<img src=http://farm"+selectedPhoto.farm+".staticflickr.com/"+selectedPhoto.server+"/"+selectedPhoto.id+"_"+selectedPhoto.secret+"_b.jpg/>"; 
    FlickrObject.random = imageURL; 
    } 
    if (callback && typeof(callback)==="function") { 
     callback(); 
    } 
});}; 

Mój kod szablonu jest taka:

Template.backgroundImage.background = function(){ 
    FlickrRandomPhotoFromSet(setID,function(){ 
     return FlickrObject; 
    }); 
}; 

Ale to wciąż pozostawia mnie zatrzymany, nie jest w stanie uzyskać określony obiekt do mojego HTML, który jest zakodowany jako takie:

<template name="backgroundImage"> 
<div id="background"> 
    {{random}} 
</div> 

Odpowiedz

10

Użyj Session jako pośrednika. To jest reaktywna, tak szybko, jak jego zestawu to zmienić szablon z nowym danych:

Template.backgroundImage.background = function(){ 
    return Session.get("FlickrObject"); 
}; 

Template.backgroundImage.created = function() { 
    FlickrRandomPhotoFromSet(setID,function(){ 
     Session.set("FlickrObject", FlickrObject) 
    }); 
} 

Więc metoda created będą uruchamiane, gdy szablon jest tworzony w celu uruchomienia FlickrRandomPhotoFromSet, gdy wynik jest zwracany będzie ustawiony Sesja sesji, która z kolei ustawi tło po otrzymaniu wyniku.

Należy także zachować ostrożność przy użyciu swojego FlickrRandomPhotoFromSet, nie zauważyłem, aby argument o numerze FlickrObject był przekazywany do wywołania zwrotnego.

+0

Dzięki za pomoc. Postanowiłem wyeliminować obiekt Flickr (który był czystą próbą odebrania zmiennej z funkcji) i przekazałem adres URL bezpośrednio do obiektu Session z funkcji. Skrypt szablonu Template.backgroundImage.background zwraca teraz plik Session.get. Wszystko teraz działa zgodnie z przeznaczeniem, z wyjątkiem tego, że adres URL jest zwracany w podwójnych cudzysłowach, a ja jeszcze nie wymyśliłem, jak to wyeliminować ...! – shongololo

+1

Możesz użyć czegoś takiego jak '/" ([^ "] +)"/i.exec (FlickrObject) [1] 'zamiast' FlickrObject' podczas ustawiania skrótu sesji.} Użyłem 'FlickrObject', ale możesz zmienić jego nazwę do tego, co masz, wyrażenie jest wyrażeniem wyrażenia regularnego, które pozbywa się enkapsulacji podwójnych cudzysłowów – Akshat

Powiązane problemy