Emberjs:检查用户是否在初始化登录facebook

时间:2014-03-01 13:53:13

标签: facebook ember.js

我正在尝试使用Facebook登录Ember应用程序。登录操作正常,但我找不到如何在初始化应用程序时检查用户是否已登录。

我正在调用auth.authResponseChange事件,但它会阻止该应用,但它永远不会启动。

App.ApplicationController = Ember.Controller.extend({
    fbUser: false,

    init: function() {
      this.checkFBUser()
    },

    checkFBUser: function() {
      FB.Event.subscribe('auth.authResponseChange', function(response) {
        // this is never triggered and the app does not init
        console.log(response)
        if (response.status === 'connected') {
          console.log('Logged in')
        }
        else {
          FB.login()
        }
      })
    },

    // this works
    actions: {
      loginFacebook: function() {
        var self = this

        FB.login(function(response) {
          if (response.authResponse) {
            FB.api('/me', function(response) {
              self.set('fbUser', response)
            })
          }
        })
      }
    }
  })

我该怎么做?

3 个答案:

答案 0 :(得分:0)

我最近没有和FB一起工作,但我很确定AuthResponeChange事件是为了通知AuthResponse状态的变化;在这种情况下,你可能想要看一下FB.getLoginStatus。

https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus

checkFBUser: function()
{
  FB.getLoginStatus(function(response) {
    if (response.status === 'connected') {
      // the user is logged in and has authenticated your
      // app, and response.authResponse supplies
      // the user's ID, a valid access token, a signed
      // request, and the time the access token 
      // and signed request each expire
      var uid = response.authResponse.userID;
      var accessToken = response.authResponse.accessToken;
    } else if (response.status === 'not_authorized') {
      // the user is logged in to Facebook, 
      // but has not authenticated your app
    } else {
      // the user isn't logged in to Facebook.
    }
 });

答案 1 :(得分:0)

我找到了问题的根源和解决方案。我不确定这是最好的解决方案,所以我对其他建议持开放态度,但如果这可以帮助其他人,那就是:

问题是Facebook库尚未加载,因此FB变量未定义。出于某种原因,如果你试图在Ember中使用未定义的变量做某事,应用程序就会在没有警告的情况下工作。所以解决方案是等待:

App.deferReadiness()

function checkFB() {
  if (typeof FB !== 'undefined') {
    APp.advanceReadiness()
  }
  else {
    setTimeout(checkFB, 10);
  }
}

setTimeout(checkFB, 10);

10毫秒非常短,所以应用程序仍然很快初始化,在我的测试中,应用程序在~20毫秒后启动。这仍然感觉有点hacky,但现在可以做到更好的解决方案。

答案 2 :(得分:0)

正如Aaron所说,您需要使用fb.getLoginStatus来检查用户是否已经登录。为了确保在您进行任何调用之前加载Facebook,您可以使用初始化程序并推迟应用程序,直到SDK加载完毕。

http://nerdyworm.com/blog/2013/04/03/ember-initializers/

Ember.Application.initializer({
    name: 'init_fb',

    initialize: function (container) {

        window.App.deferReadiness();

        Ember.$.getScript( '//connect.facebook.net/en_UK/all.js', function(  ) {

            FB.init( {
                appId : 'xxxxxxxxxxxxx',
                xfbml : true,
                version : 'v2.0',
            } );

            window.App.advanceReadiness();

        } );
    }
});