2013-05-19 3 views
6

Ich versuche, eine Flickr-URL basierend auf einem Flickr-API-Aufruf zu generieren, und gebe dieses Ergebnis dann an eine lenker.js-Vorlage zurück. Ich kämpfe um asynchrone Prozesse herum.Meteor - asynchrone Funktion an Lenkervorlage zurückgeben?

Ich habe versucht, eine Callback-Funktion zu erstellen, aber ich bin immer noch unsicher, wie Sie ein definiertes Objekt oder eine Variable in die HTML-Vorlage erhalten. Hier

ist der Code für die Funktion 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(); 
    } 
});}; 

My Template-Code ist dies:

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

Aber noch lässt mich fest, nicht in der Lage, um ein definiertes Objekt zu erhalten in mein HTML, die als solche codiert:

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

Antwort

10

Verwenden Sie Session als Vermittler. Es reagiert so, sobald ihr Set wird es die Vorlage mit den neuen Daten ändern:

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

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

So ist die created Methode ausgeführt wird, wenn die Vorlage erstellt wird FlickrRandomPhotoFromSet laufen, wenn das Ergebnis zurückgegeben wird es eingestellt wird der Session-Hash, der wiederum den Hintergrund festlegt, sobald das Ergebnis empfangen wird.

Seien Sie vorsichtig mit Ihren FlickrRandomPhotoFromSet auch ich nicht bemerkt sie FlickrObject ein Argument musste den Rückruf zu übergeben.

+0

Danke für Ihre Hilfe. Ich habe mich entschieden, das Flickr-Objekt zu entfernen (was lediglich ein Versuch war, die Variable aus der Funktion zu entfernen), und ich habe die URL direkt an das Session-Objekt innerhalb der Funktion übergeben. Das Vorlagen-Template Template.backgroundImage.background gibt jetzt das Session.get zurück. Alles funktioniert jetzt wie vorgesehen, außer dass die URL in doppelten Anführungszeichen zurückgegeben wird und ich noch nicht herausgefunden habe, wie man das beseitigt ...! – shongololo

+1

Sie könnten etwas wie '/" ([^ "] +)"/ifxec (FlickrObject) [1] 'anstelle von' FlickrObject' verwenden, wenn Sie den Session-Hash setzen.Ich habe 'FlickrObject' verwendet, aber Sie können es umbenennen was auch immer Sie haben, der Ausdruck ist ein Regexp-Ausdruck, der die einkapselnden Anführungszeichen beseitigt – Akshat

Verwandte Themen