Backbone / Facebook API无法按预期工作?

时间:2015-04-03 15:13:07

标签: javascript facebook backbone.js facebook-javascript-sdk marionette

在我的index.html中,我调用了Facebook SDK。在那里,我有以下代码在我的Backbone应用程序中触发控制器。

触发器运行一个函数,该函数调用获取登录用户的FB.api()

骨干代码的第一个例子工作得很好,但是第二个有一个我传递数据的中间函数,但它从facebook all.js文件中得到了一个错误。

想要中间功能的原因是以后能够以不同的顺序触发它们。

Facebook SDK:

FB.Event.subscribe("auth.statusChange", function (response) {
    MyApp.trigger("fb:initialize", response);
});

backbone.js控制器代码工作

    initialize: function() {
        App.on("fb:initialize", this.getUser);
    },

    getUser: function(event) {
        if (event.status === "connected") {
            FB.api("/me", function (response) {
                if (response && !response.error) {
                    console.log(response);
                }
            });
        } else {
            //do nothing
        }
    }

backbone.js控制器代码 NOT WORKING

    initialize: function() {
        App.on("fb:initialize", this.testFunction);
    },

    testFunction: function(event) {
        var status = event.status;
        this.getUser(status);
    },

    getUser: function(status) {
        if (status === "connected") {
            FB.api("/me", function (response) {
                if (response && !response.error) {
                    console.log(response);
                }
            });
        } else {
            //do nothing
        }
    }

到目前为止,我尝试使用我认为称为“闭包”的东西。由于FB.api()是异步的,thiswindow而不是当前对象相关。所以我尝试在调用之外将变量设置为this。但它也行不通。

例如:

        var oThis = this;
        var apiString = '/' + this.model.id + '/photos';
        FB.api(apiString, function(response){
            loadPhoto(response,  1, oThis.model);
        });

1 个答案:

答案 0 :(得分:0)

尝试

  initialize: function() {
    var _this = this;
    App.on("fb:initialize", function(event) {
      _this.getUser(event.status);
    });
  },

  getUser: function(status) {
    if (status === "connected") {
      FB.api("/me", function (response) {
        if (response && !response.error) {
          console.log(response);
        }
      });
    } else {
      //do nothing
    }
  }

或者使用下划线.bind()始终绑定到右侧。 http://underscorejs.org/#bind