【问题标题】:Meteor - return asynchronous function to handlebar template?Meteor - 将异步函数返回到车把模板?
【发布时间】:2013-05-19 20:20:18
【问题描述】:

我正在尝试基于 Flickr API 调用生成 Flickr url,然后将该结果返回到 handlebars.js 模板。我正在努力寻找解决异步进程的方法。

我已经尝试创建一个回调函数,但我仍然不确定如何将已定义的对象或变量获取到 HTML 模板中。

这是 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();
    }
});};

我的模板代码是这样的:

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

但这仍然让我陷入困境,无法将定义的对象放入我的 HTML 中,其编码如下:

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

【问题讨论】:

    标签: asynchronous meteor handlebars.js


    【解决方案1】:

    使用Session 作为中介。它是响应式的,因此一旦设置它就会使用新数据更改模板:

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

    所以created方法将在创建模板时运行FlickrRandomPhotoFromSet,当返回结果时它会设置Session哈希值,一旦收到结果就会设置背景。

    也要小心你的FlickrRandomPhotoFromSet,我没有注意到你有一个参数让FlickrObject 传递给回调。

    【讨论】:

    • 感谢您的帮助。我决定消除 Flickr 对象(这纯粹是试图将变量从函数中取出),并且我已经将 url 从函数内直接传递给 Session 对象。 Template.backgroundImage.background 模板脚本现在返回 Session.get。现在一切都按预期工作,只是 URL 以重复的引号返回,我还没有想出如何消除它......!
    • 在设置 Session 哈希时,您可以使用 /"([^"]+)"/i.exec(FlickrObject)[1] 代替 FlickrObject。我使用了FlickrObject,但您可以将其重命名为您拥有的任何名称,该表达式是一个正则表达式,它摆脱了封装双引号
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2013-11-21
    • 1970-01-01
    • 2013-10-27
    • 2013-08-25
    相关资源
    最近更新 更多