2015-10-28 10 views
8

Sto provando a ottenere il plugin di condivisione di Facebook attivo e funzionante. Il problema che ho riscontrato è che devo ricaricare la pagina per far apparire il pulsante di condivisione. Se navigo alla pagina tramite link o url il pulsante di condivisione di Facebook non verrà visualizzato, devo ricaricare la pagina e quindi il pulsante verrà visualizzato. Sto usando angolare, quindi ho pensato di usare una direttiva, ma finora i miei sforzi non hanno avuto successo.angolare necessità di ricaricare la pagina per il pulsante di condivisione fb da mostrare

qui è dove ho la direttiva nel mio modello

<div class="fb-share-button" fb-share data-href="{{fbUrl}}" data-layout="button" id='fb-share'></div> 

ecco la mia direttiva.

angular.module('App').directive('fbShare', function() { 
    function createHTML(href, layout) { 
     return '<div class="fb-share-button" ' + 
         'data-href="' + href + '" ' + 
         'data-layout="' + layout + '" ' + 
       '</div>'; 
    } 

    return { 
     restrict: 'A', 
     scope: {}, 
     link: function postLink(scope, elem, attrs) { 
     attrs.$observe('dataHref', function (newValue) { 
       var href  = newValue; 
       var layout = attrs.layout || 'button'; 

       elem.html(createHTML(href, layout)); 
       FB.XFBML.parse(elem[0]); 
      }); 
     } 
    }; 
}); 

il codice facebook sdk, che si trova subito dopo il tag body apertura

<div id="fb-root"></div> 
    <script>(function(d, s, id) { 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) return; 
    js = d.createElement(s); js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5&appId=xxxxxxxxxx"; 
    fjs.parentNode.insertBefore(js, fjs); 
    }(document, 'script', 'facebook-jssdk')); 
    </script> 
+0

Che cosa è con la creazione HTML strano? Basta usare un modello – Phil

+0

Hai aggiunto un 'console.log' all'interno del callback' $ observ'? Puoi fornire un plunkr. –

risposta

7

Ecco una grande serie di direttive per i widget di condivisione angolari tra cui FB: http://plnkr.co/edit/OvZRK6?p=preview

Basta impostare la vostra FB APP ID e utente una variabile scope per il tuo url, imageURl e Name.

Se si visualizza il codice, è possibile vedere come eseguire il rendering del codice ed eventualmente personalizzare il modello FB in base alle proprie esigenze.

angular.module('myApp', ['angulike']) 
 
    .run([ 
 
    '$rootScope', 
 
    function($rootScope) { 
 
     $rootScope.facebookAppId = '85024842290'; // set your facebook app id here 
 
    } 
 
    ]); 
 

 
angular.module('myApp') 
 
    .controller('myController', [ 
 
    '$scope', 
 
    function($scope) { 
 
     $scope.myModel = { 
 
     Url: 'http://jasonwatmore.com/post/2014/08/01/AngularJS-directives-for-social-sharing-buttons-Facebook-Like-GooglePlus-Twitter-and-Pinterest.aspx', 
 
     Name: "AngularJS directives for social sharing buttons - Facebook, Google+, Twitter and Pinterest | Jason Watmore's Blog", 
 
     ImageUrl: 'http://www.jasonwatmore.com/pics/jason.jpg' 
 
     }; 
 
    } 
 
    ]); 
 

 

 
/** 
 
* AngularJS directives for social sharing buttons - Facebook Like, Google+, Twitter and Pinterest 
 
* @author Jason Watmore <[email protected]> (http://jasonwatmore.com) 
 
* @version 1.2.0 
 
*/ 
 
(function() { 
 
    angular.module('angulike', []) 
 

 
    .directive('fbLike', [ 
 
    '$window', '$rootScope', 
 
    function($window, $rootScope) { 
 
     return { 
 
     restrict: 'A', 
 
     scope: { 
 
      fbLike: '=?' 
 
     }, 
 
     link: function(scope, element, attrs) { 
 
      if (!$window.FB) { 
 
      // Load Facebook SDK if not already loaded 
 
      $.getScript('//connect.facebook.net/en_US/sdk.js', function() { 
 
       $window.FB.init({ 
 
       appId: '85024842290', 
 
       xfbml: true, 
 
       version: 'v2.0' 
 
       }); 
 
       renderLikeButton(); 
 
      }); 
 
      } else { 
 
      renderLikeButton(); 
 
      } 
 

 
      var watchAdded = false; 
 

 
      function renderLikeButton() { 
 
      if (!!attrs.fbLike && !scope.fbLike && !watchAdded) { 
 
       // wait for data if it hasn't loaded yet 
 
       watchAdded = true; 
 
       var unbindWatch = scope.$watch('fbLike', function(newValue, oldValue) { 
 
       if (newValue) { 
 
        renderLikeButton(); 
 

 
        // only need to run once 
 
        unbindWatch(); 
 
       } 
 

 
       }); 
 
       return; 
 
      } else { 
 
       element.html('<div class="fb-like"' + (!!scope.fbLike ? ' data-href="' + scope.fbLike + '"' : '') + ' data-layout="button_count" data-action="like" data-show-faces="true" data-share="true"></div>'); 
 
       $window.FB.XFBML.parse(element.parent()[0]); 
 
      } 
 
      } 
 
     } 
 
     }; 
 
    } 
 
    ]) 
 

 
    .directive('googlePlus', [ 
 
    '$window', 
 
    function($window) { 
 
     return { 
 
     restrict: 'A', 
 
     scope: { 
 
      googlePlus: '=?' 
 
     }, 
 
     link: function(scope, element, attrs) { 
 
      if (!$window.gapi) { 
 
      // Load Google SDK if not already loaded 
 
      $.getScript('//apis.google.com/js/platform.js', function() { 
 
       renderPlusButton(); 
 
      }); 
 
      } else { 
 
      renderPlusButton(); 
 
      } 
 

 
      var watchAdded = false; 
 

 
      function renderPlusButton() { 
 
      if (!!attrs.googlePlus && !scope.googlePlus && !watchAdded) { 
 
       // wait for data if it hasn't loaded yet 
 
       watchAdded = true; 
 
       var unbindWatch = scope.$watch('googlePlus', function(newValue, oldValue) { 
 
       if (newValue) { 
 
        renderPlusButton(); 
 

 
        // only need to run once 
 
        unbindWatch(); 
 
       } 
 

 
       }); 
 
       return; 
 
      } else { 
 
       element.html('<div class="g-plusone"' + (!!scope.googlePlus ? ' data-href="' + scope.googlePlus + '"' : '') + ' data-size="medium"></div>'); 
 
       $window.gapi.plusone.go(element.parent()[0]); 
 
      } 
 
      } 
 
     } 
 
     }; 
 
    } 
 
    ]) 
 

 
    .directive('tweet', [ 
 
    '$window', '$location', 
 
    function($window, $location) { 
 
     return { 
 
     restrict: 'A', 
 
     scope: { 
 
      tweet: '=', 
 
      tweetUrl: '=' 
 
     }, 
 
     link: function(scope, element, attrs) { 
 
      if (!$window.twttr) { 
 
      // Load Twitter SDK if not already loaded 
 
      $.getScript('//platform.twitter.com/widgets.js', function() { 
 
       renderTweetButton(); 
 
      }); 
 
      } else { 
 
      renderTweetButton(); 
 
      } 
 

 
      var watchAdded = false; 
 

 
      function renderTweetButton() { 
 
      if (!scope.tweet && !watchAdded) { 
 
       // wait for data if it hasn't loaded yet 
 
       watchAdded = true; 
 
       var unbindWatch = scope.$watch('tweet', function(newValue, oldValue) { 
 
       if (newValue) { 
 
        renderTweetButton(); 
 

 
        // only need to run once 
 
        unbindWatch(); 
 
       } 
 
       }); 
 
       return; 
 
      } else { 
 
       element.html('<a href="https://twitter.com/share" class="twitter-share-button" data-text="' + scope.tweet + '" data-url="' + (scope.tweetUrl || $location.absUrl()) + '">Tweet</a>'); 
 
       $window.twttr.widgets.load(element.parent()[0]); 
 
      } 
 
      } 
 
     } 
 
     }; 
 
    } 
 
    ]) 
 

 
    .directive('pinIt', [ 
 
    '$window', '$location', 
 
    function($window, $location) { 
 
     return { 
 
     restrict: 'A', 
 
     scope: { 
 
      pinIt: '=', 
 
      pinItImage: '=', 
 
      pinItUrl: '=' 
 
     }, 
 
     link: function(scope, element, attrs) { 
 
      if (!$window.parsePins) { 
 
      // Load Pinterest SDK if not already loaded 
 
      (function(d) { 
 
       var f = d.getElementsByTagName('SCRIPT')[0], 
 
       p = d.createElement('SCRIPT'); 
 
       p.type = 'text/javascript'; 
 
       p.async = true; 
 
       p.src = '//assets.pinterest.com/js/pinit.js'; 
 
       p['data-pin-build'] = 'parsePins'; 
 
       p.onload = function() { 
 
       if (!!$window.parsePins) { 
 
        renderPinItButton(); 
 
       } else { 
 
        setTimeout(p.onload, 100); 
 
       } 
 
       }; 
 
       f.parentNode.insertBefore(p, f); 
 
      }($window.document)); 
 
      } else { 
 
      renderPinItButton(); 
 
      } 
 

 
      var watchAdded = false; 
 

 
      function renderPinItButton() { 
 
      if (!scope.pinIt && !watchAdded) { 
 
       // wait for data if it hasn't loaded yet 
 
       watchAdded = true; 
 
       var unbindWatch = scope.$watch('pinIt', function(newValue, oldValue) { 
 
       if (newValue) { 
 
        renderPinItButton(); 
 

 
        // only need to run once 
 
        unbindWatch(); 
 
       } 
 
       }); 
 
       return; 
 
      } else { 
 
       element.html('<a href="//www.pinterest.com/pin/create/button/?url=' + (scope.pinItUrl || $location.absUrl()) + '&media=' + scope.pinItImage + '&description=' + scope.pinIt + '" data-pin-do="buttonPin" data-pin-config="beside"></a>'); 
 
       $window.parsePins(element.parent()[0]); 
 
      } 
 
      } 
 
     } 
 
     }; 
 
    } 
 
    ]); 
 

 
})();
<!DOCTYPE html> 
 
<html ng-app="myApp"> 
 

 
<head> 
 
    <meta charset="utf-8" /> 
 
    <title>AngularJS directives for social sharing buttons - Facebook Like, Google+, Twitter and Pinterest</title> 
 
    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" /> 
 
</head> 
 

 
<body> 
 
    <div ng-controller="myController" class="jumbotron text-center"> 
 
    <div class="container"> 
 
     <div fb-like></div> 
 
     <div class="col-xs-3"> 
 
     <div fb-like="myModel.Url"></div> 
 
     </div> 
 
     <div class="col-xs-3"> 
 
     <div tweet="myModel.Name" tweet-url="myModel.Url"></div> 
 
     </div> 
 
     <div class="col-xs-3"> 
 
     <div google-plus="myModel.Url"></div> 
 
     </div> 
 
     <div class="col-xs-3"> 
 
     <div pin-it="myModel.Name" pin-it-image="myModel.ImageUrl" pin-it-url="myModel.Url"></div> 
 
     </div> 
 
    </div> 
 
    </div> 
 
    <div class="credits text-center"> 
 
    <p> 
 
     <a href="http://www.jasonwatmore.com/post/2014/08/01/AngularJS-directives-for-social-sharing-buttons-Facebook-Like-GooglePlus-Twitter-and-Pinterest.aspx">AngularJS directives for social sharing buttons</a> 
 
    </p> 
 
    <p> 
 
     <a href="http://www.jasonwatmore.com">www.jasonwatmore.com</a> 
 
    </p> 
 
    </div> 
 
    <script src="http://code.jquery.com/jquery-2.0.3.min.js"></script> 
 
    <script src="https://code.angularjs.org/1.2.16/angular.js"></script> 
 
    <script src="angulike.js"></script> 
 
    <script src="app.js"></script> 
 
</body> 
 

 
</html>

Problemi correlati