2015-10-28 25 views
8

私はfacebook共有プラグインを稼働させようとしています。私が実行している問題は、実際に共有ボタンが表示されるようにページをリロードする必要があることです。リンクやURLを使ってページに移動すると、Facebookの共有ボタンが表示されず、ページをリロードしてからボタンが表示されます。私は角度を使用しているので、指示を使用すると考えられていましたが、これまでのところ私の努力は成功していませんでした。私は私のテンプレートfb共有ボタンを表示するためにページをリロードする必要があります

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

にディレクティブを持っているのはここ

は、ここに私の指示です。

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]); 
      }); 
     } 
    }; 
}); 

ちょうどオープニングbodyタグの後に

ここ
<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

奇妙なHTMLの作成とは何ですか?テンプレートを使用するだけです – Phil

+0

'$ observe'コールバックの中に' console.log'を追加しましたか?あなたはplunkrを提供できますか? –

答えて

7

であるFacebookのSDKコードは、FBを含む角度共有ウィジェットのディレクティブの偉大なセットです:http://plnkr.co/edit/OvZRK6?p=preview

はちょうどあなたのFB APPを設定しますIDとユーザーにあなたのurl、imageURl、およびNameのスコープ変数。

コードを表示すると、コードをレンダリングしたり、必要に応じてFBテンプレートをカスタマイズする方法がわかります。

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>

関連する問題