Skip to content

Instantly share code, notes, and snippets.

@ruiwen
Last active July 5, 2017 10:40
Show Gist options
  • Select an option

  • Save ruiwen/4722499 to your computer and use it in GitHub Desktop.

Select an option

Save ruiwen/4722499 to your computer and use it in GitHub Desktop.
Wrapping and initialising the Facebook SDK with Angular JS
// Facebook SDK
angular.module('facebook', [])
.directive('fb', ['$FB', function($FB) {
return {
restrict: "E",
replace: true,
template: "<div id='fb-root'></div>",
compile: function(tElem, tAttrs) {
return {
post: function(scope, iElem, iAttrs, controller) {
var fbAppId = iAttrs.appId || '';
var fb_params = {
appId: iAttrs.appId || "",
cookie: iAttrs.cookie || true,
status: iAttrs.status || true,
xfbml: iAttrs.xfbml || true
};
// Setup the post-load callback
window.fbAsyncInit = function() {
$FB._init(fb_params);
if('fbInit' in iAttrs) {
iAttrs.fbInit();
}
};
(function(d, s, id, fbAppId) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk', fbAppId));
}
}
}
};
}])
.factory('$FB', ['$rootScope', function($rootScope) {
var fbLoaded = false;
// Our own customisations
var _fb = {
loaded: fbLoaded,
_init: function(params) {
if(window.FB) {
// FIXME: Ugly hack to maintain both window.FB
// and our AngularJS-wrapped $FB with our customisations
angular.extend(window.FB, _fb);
angular.extend(_fb, window.FB);
// Set the flag
_fb.loaded = true;
// Initialise FB SDK
window.FB.init(params);
if(!$rootScope.$$phase) {
$rootScope.$apply();
}
}
}
}
return _fb;
}]);
<!DOCTYPE html>
<html ng-app='app'>
<head></head>
<body>
<fb app-id='123123'></fb>
</body>
</html>
@valentinvieriu

Copy link
Copy Markdown

Thank you for your gist! This is very helpful!
Can you please explain what this part does?

                    // Setup the post-load callback
                    window.fbAsyncInit = function() {
                      $FB._init();
                        if('fbInit' in iAttrs) {
                            iAttrs.fbInit();
                        }
                    };

Thank you

@ruiwen

ruiwen commented May 5, 2013

Copy link
Copy Markdown
Author

Hi! Glad you found it useful!

window.fbAsyncInit is the function the FB SDK attempts to execute once it's successfully loaded. Here, I point window.fbAsyncInit to a wrapper function that executes some standard init code in $FB_init(), while giving users the option to pass their own initialisation function in the fb-init attribute of the widget, like so

<fb app-id="12312312" fb-init="someFunction()">

So if there was custom code you'd like to run after the FB SDK was loaded, you'd stick it in someFunction().

@johannesjo

Copy link
Copy Markdown

Great Work. You should consider making this a repository!

I also got a question: How would you add more services like one for example which would try to get the like status of a person?

@devniel

devniel commented Jun 23, 2013

Copy link
Copy Markdown

Thanks ! , I made a fork for use FB.api after verify authentication to avoid the "token problem" and an example about how to use this on controllers , https://gist.github.com/devnieL/5846169

@blak3mill3r

Copy link
Copy Markdown

Thanks, this is fantastic! I suggest, as an alternative to the 'ugly hack', provide a wrapper around the 'api' function (and maybe others) that calls $apply for you, and perhaps $broadcast on $rootScope for the FB events like authResponseChange ... cool stuff!

@MrLugh

MrLugh commented Nov 15, 2013

Copy link
Copy Markdown

This is a BIG ONE!!!!!!!!

@xtrasmal

Copy link
Copy Markdown

great

@ranjitpillai

Copy link
Copy Markdown

Hi I want ti integrate Facebook Login integration in Angularjs
Ur above code for html and angularjs i have seen.....

What is the code for controller

@theraaz

theraaz commented Apr 9, 2014

Copy link
Copy Markdown

Perfect, Solved my whole problem. Thanks man

@deanq

deanq commented Apr 25, 2014

Copy link
Copy Markdown

Thank you for starting this. I have modified it for my purpose. I am using it for PhoneGap + Parse. Check it out here: https://gist.github.com/deanq/11274826

@gonzalodiaz

Copy link
Copy Markdown

This is awesome! You saved me days of work! thanks a lot!

@mrphilipandrews

Copy link
Copy Markdown

You can also watch the loaded flag from a Controller, this works fine.

scope.$watch( function(){ return $FB.loaded }, function(){ console.log('$FB.loaded', $FB.loaded); });

@mazhekin

mazhekin commented Dec 3, 2015

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment