Meteor:IF语句返回true但页面显示为false(显示用户Facebook图片)

时间:2014-08-09 09:58:59

标签: meteor

我试图在Facebook用户登录时显示Facebook图片,并在非Facebook用户登录时显示占位符。

我在user_page html中创建了一个if语句:

        {{#if facebookuserloggedin}}
        TRUE
        <img src="http://graph.facebook.com/{{facebookuser}}/picture/picture?type=large" alt="{{user}}">
        {{else}}
        False
        <img src="user.png" alt="stanley">
        {{/if}}
        <h1>Welcome {{user}}</h1>

和一个检查facebook登录状态的助手

 facebookuserloggedin: function(){
    FB.getLoginStatus(function (response) {
        console.log (response)
        if (response.status === 'connected') {
            (alert ("true"))
            return true
        }
        else {
            (alert("false"))
            return false
        }
    });

由于某种原因,警报显示帮助程序返回true(当facebook用户登录时),但html页面显示为false。因此,占位符显示而不是facebook个人资料图片。我真的不知道这是怎么回事,任何人都可以帮助我吗?提前致谢。

1 个答案:

答案 0 :(得分:2)

正如@apendua所说,辅助函数是同步的,而你调用异步函数。简而言之,这意味着您编写的return语句不是帮助函数的返回语句,而是您传递给FB.getLoginStatus的函数。请注意,您使用了function关键字两次,因此您在那里有两个函数,并且return语句是错误的。

对于初学者来说这是一个常见的陷阱,所以不用担心,这很容易解决。它需要将你的状态存储在另一个地方(比如一个局部变量)并反复观察它。

这里可以使用的模式很少。首先,我建议在rendered回调中调用异步函数,并为结果创建单独的依赖项。这应该可以让您最好地了解正在发生的事情。

var status = null
var statusDep = new Deps.dependency();

Template.templateName.rendered = function() {
    FB.getLoginStatus(function(response) {
        ...
        if(...) {
            status = true;
            statusDep.changed();
        } else {
            status = false;
            statusDep.changed();
        }
    });
};

Template.templateName.helpers({
    facebookuserloggedin: function() {
        statusDep.depend();
        return status;
    };
});