13

我正在尝试为 Angular 创建一个 facebook 服务,以便我可以更轻松地测试需要使用 Facebook JS SDK 和 Graph API 的代码。

这是我到目前为止所拥有的:

app.factory('facebook', function() {
    return FB;
});

window.fbAsyncInit = function () {
    FB.init({
        appId: 'SOME_APP_ID_HERE', // App ID
        status: true, // check login status
        cookie: true, // enable cookies to allow the server to access the session
        xfbml: true,  // parse XFBML
        oauth: true
    });
};

// Load the SDK Asynchronously
(function (d) {
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) { return; }
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    ref.parentNode.insertBefore(js, ref);
})(document);

现在,我知道实际的 Facebook SDK 部分正在工作......但在我的控制器中,引用始终为空。

在我的控制器中,我只有这样的东西:

function FooCtrl($scope, facebook) {
    facebook.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            var uid = response.authResponse.userID;
            var accessToken = response.authResponse.accessToken;
            // do something
        } 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.
        }
    });
}

Angular 然后抱怨它找不到 facebookProvider。关于我如何做到这一点的任何想法?

4

2 回答 2

6

用数组括号括起来你的工厂函数,如下所示

app.factory('facebook', [function() {
    return FB;
}]);

API 文档不够清晰。具有数组括号的要点是您可以指定依赖项。它将在使用 AUTO.$inject 创建您的服务时注入。但是由于您没有依赖项,它将跳过该任务:)

无论如何,如果您需要依赖项,您可以像这样请求它们

app.factory('facebook', ["$log", function($someCrazyLoggerService){
    $someCrazyLoggerService.log("I'm Auto Injected crazy Logger");
}]);
于 2012-08-19T23:18:59.143 回答
1

你应该看看我写的这个 Facebook 模块。

首先在您的应用程序配置调用中使用 FacebookProvider,例如 FacebookProvider.init('yourFacebookAppIdHere');,您还可以配置其他设置,然后在您的控制器上使用 Facebook 服务并异步注册事件和调用方法;​​)

https://github.com/ciul/angularjs-facebook

于 2013-08-19T13:17:34.190 回答