我试图基于Flickr API调用生成Flickr URL,然后将该结果返回到handlebars.js模板.我正在努力寻找绕过异步进程的方法.
我试图创建一个回调函数,但我仍然不确定如何将已定义的对象或变量放入HTML模板中.
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(); } });};
我的模板代码是这样的:
Template.backgroundImage.background = function(){ FlickrRandomPhotoFromSet(setID,function(){ return FlickrObject; }); };
但这仍然让我陷入困境,无法将定义的对象放入我的HTML中,其编码如下:
<template name="backgroundImage"> <div id="background"> {{random}} </div>
解决方法
使用Session作为中介.它是被动的,所以只要它设置它就会用新数据改变模板:
Template.backgroundImage.background = function(){ return Session.get("FlickrObject"); }; Template.backgroundImage.created = function() { FlickrRandomPhotoFromSet(setID,function(){ Session.set("FlickrObject",FlickrObject) }); }
因此,创建模板以运行FlickrRandomPhotoFromSet时将运行创建的方法,当返回结果时,它将设置Session哈希,而后者将在收到结果后立即设置背景.
小心你的FlickrRandomPhotoFromSet,我没注意到你有一个FlickrObject的参数传递给回调.