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.
If you are using the new AddThis dashboard configuration then you can just wrap
addthis.layers.refresh()
(see: http://www.addthis.com/academy/using-dashboard-configuration-tools-dynamically/) in a directive and add to your div.HTML:
<div addthis-toolbox class="addthis_sharing_toolbox"></div>
Try:
In your angular directive or controller inyect de
$window
object after call the next method:$window.addthis.layers.refresh();
I have created the simple AngularJS directive to refresh AddThis toolbox defined inside the dynamically included partial
Usage example:
Default widget code from addthis site should also work, just remove
&async=1
andaddthis.init()
.You can use a similar approach to control other addThis functions, such as
addthis.button()
,addthis.counter()
etc.@antonpinchuk's solution worked well for me, it just doesn't update the counter... I added the following line at the end of the directive and now everything works like a charm :)
You're probably going to need to put the script tag references for your add this script in your partial. That would be the easiest fix.
What's happening is at the time they're being run, the partial hasn't loaded yet, so they don't affect anything.
Wanted to add an additional point to the answer by atonpinchuk. An issue we had in our app was that we had the addthis buttons on various pages and wanted the url and title to vary depending on the page. We have a service that updates the meta tags but because addthis is initiated with the script in our main template, addthis did not pick up on our changed meta tags.
Our solution was to use the sharing configuration in our directive as noted here: http://support.addthis.com/customer/portal/articles/381263-addthis-client-api#configuration-sharing
This way addthis picks up the right url and titles. Of course if you want to fully mimick the social sharing features of a non-client side webiste, this is only half the battle. You would need to also write your own service to update tags in the head. Then you need to use phantomJS to create static versions of your site and redirect google, facebook, and other crawlers to it.
An issue we are having is that the buttons don't render in IE8 for some reason. Haven't figured out a solution yet. The weird thing is that it works if you call it
addthis.init()
in a script tag via the HTML but this won't work for an SPA. Alsoaddthis.init()
is available (ie!!addthis.init() == true
in the directive so I am not sure what is wrong with it.