jqueryangularjsaddthis

AngularJs and AddThis social plugin


I'm trying to use the AddThis javascript Social plugin in an AngularJS App, but It does not updates the addthis plugin icons when I load a partial with ng-view. If I refresh the page it does (ctrl+F5) . I think AngularJs loads the partial views via Ajax an in that case addthis does not show the social icons of the loaded page.

This is the index code:

<header>
       .....
</header>
<div>
     <section id="content" ng-view></section>
</div>
<footer id="footer" ng-controller="footerCtrl">
     ...
</footer>

This is the partial view that loads in the section tag ,where i have the addthis icons:

<div class="ad-col" >
        <p ng-bind-html-unsafe="homeContent.promo.entradilla"></p>
        <br />
        <br />
        <!-- AddThis Button BEGIN -->
        <div class="addthis_toolbox addthis_default_style addthis_32x32_style">
            <a class="addthis_button_facebook"></a>
            <a class="addthis_button_twitter"></a>
            <a class="addthis_button_linkedin"></a>
            <a class="addthis_button_google_plusone_badge"></a>
            <a class="addthis_button_pinterest_pinit"></a>
            <a class="addthis_button_compact"></a>
            <a class="addthis_counter addthis_bubble_style"></a>
        </div>
        <!-- AddThis Button END -->
    </div>

Of course, i have the script reference fot AddThis in the Home page:

<script type="text/javascript">var addthis_config = { "data_track_addressbar": true };</script>
    <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-5113c1e01aaacb3f"></script>

I have the jquery script reference before angularJs reference:

        <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script>

Thanks in advance.


Solution

  • I have created the simple AngularJS directive to refresh AddThis toolbox defined inside the dynamically included partial

    angular.module('Directive.AddThis', [])
    
    /**
     * AddThis widget directive
     *
     * Usage:
     *   1. include `addthis_widget.js` in header with async=1 parameter
     *   <script src="//s7.addthis.com/js/300/addthis_widget.js#pubid=<pubid>&async=1"></script>
     *   http://support.addthis.com/customer/portal/articles/381263-addthis-client-api#configuration-url
     *   2. add "addthis-toolbox" directive to a widget's toolbox div
     *   <div addthis-toolbox class="addthis_toolbox addthis_default_style addthis_32x32_style">
     *     ...       ^
     *   </div>
     */
    .directive('addthisToolbox', function() {
        return {
            restrict: 'A',
            transclude: true,
            replace: true,
            template: '<div ng-transclude></div>',
            link: function ($scope, element, attrs) {
                // Dynamically init for performance reason
                // Safe for multiple calls, only first call will be processed (loaded css/images, popup injected)
                // http://support.addthis.com/customer/portal/articles/381263-addthis-client-api#configuration-url
                // http://support.addthis.com/customer/portal/articles/381221-optimizing-addthis-performance
                addthis.init();
                // Ajax load (bind events)
                // http://support.addthis.com/customer/portal/articles/381263-addthis-client-api#rendering-js-toolbox
                // http://support.addthis.com/customer/portal/questions/548551-help-on-call-back-using-ajax-i-lose-share-buttons
                addthis.toolbox($(element).get());
            }
        }
    });
    

    Usage example:

    <html>
    <head>
        <script src="//s7.addthis.com/js/300/addthis_widget.js#pubid=<my-pubid>&async=1"></script>
    </head>
    <body>
    
      <!-- AddThis Button BEGIN -->
      <div addthis-toolbox class="addthis_toolbox addthis_default_style addthis_32x32_style">
          <a class="addthis_button_facebook"></a>
          <a class="addthis_button_twitter"></a>
          <a class="addthis_button_google_plusone_share"></a>
          <a class="addthis_button_compact"></a>
          <a class="addthis_counter addthis_bubble_style"></a>
          <script type="text/javascript">var addthis_config = { "data_track_clickback": false, "data_track_addressbar":false };</script>
      </div>
      <!-- AddThis Button END -->
    
    </body>
    </html>
    

    Default widget code from addthis site should also work, just remove &async=1 and addthis.init().

    You can use a similar approach to control other addThis functions, such as addthis.button(), addthis.counter() etc.