我正在尝试在AngularJS应用程序中使用AddThis javascript社交插件,但是当我使用ng-view加载部分时,它不会更新addthis插件图标。如果我刷新页面(ctrl + F5)。我认为AngularJs通过Ajax加载部分视图,在这种情况下,addthis不显示加载页面的社交图标。
这是索引代码:
<header>
.....
</header>
<div>
<section id="content" ng-view></section>
</div>
<footer id="footer" ng-controller="footerCtrl">
...
</footer>
这是在section标签中加载的局部视图,其中我有addthis图标:
<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>
当然,我在主页中有脚本参考文件AddThis:
<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>
我在angularJs引用之前有jquery脚本引用:
<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>
提前致谢。
答案 0 :(得分:10)
我创建了简单的AngularJS指令来刷新动态包含的部分
中定义的AddThis工具箱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());
}
}
});
用法示例:
<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>
来自addthis site的默认窗口小部件代码也应该有效,只需删除&async=1
和addthis.init()
。
您可以使用类似的方法来控制其他addThis函数,例如addthis.button()
,addthis.counter()
等。
答案 1 :(得分:7)
如果您使用的是新的AddThis仪表板配置,那么您只需将addthis.layers.refresh()
(请参阅:http://www.addthis.com/academy/using-dashboard-configuration-tools-dynamically/)包装在指令中并添加到您的div中。
.directive('addthisToolbox', function() {
return {
restrict: 'A',
transclude: true,
replace: true,
template: '<div ng-transclude></div>',
link: function ($scope, element, attrs) {
// Checks if addthis is loaded yet (initial page load)
if (addthis.layers.refresh) {
addthis.layers.refresh();
}
}
};
});
HTML:
<div addthis-toolbox class="addthis_sharing_toolbox"></div>
答案 2 :(得分:2)
希望通过atonpinchuk为答案增加一点。我们在我们的应用程序中遇到的一个问题是我们在各个页面上都有addthis按钮,并希望URL和标题因页面而异。我们有一个更新元标记的服务,但是因为addthis是通过我们的主模板中的脚本启动的,所以我没有选择我们更改的元标记。
我们的解决方案是在我们的指令中使用共享配置,如下所示:http://support.addthis.com/customer/portal/articles/381263-addthis-client-api#configuration-sharing
这样,addthis会选择正确的网址和标题。当然,如果你想完全模仿非客户端网站的社交共享功能,这只是成功的一半。您还需要编写自己的服务来更新头部的标签。然后,您需要使用phantomJS创建您网站的静态版本,并将谷歌,脸书和其他抓取工具重定向到它。
我们遇到的一个问题是,由于某种原因,按钮不会在IE8中呈现。尚未找到解决方案。奇怪的是,如果你通过HTML在脚本标签中调用它addthis.init()
,它就有效,但这不适用于SPA。此外,addthis.init()
可用(即!!addthis.init() == true
指令,因此我不确定它有什么问题。
答案 3 :(得分:2)
@ antonpinchuk的解决方案对我来说效果很好,它只是不更新计数器...... 我在指令的末尾添加了以下行,现在一切都像魅力一样:)
addthis.counter($(element).children('.addthis_counter').get());
答案 4 :(得分:1)
尝试:
`<script type="text/javascript">
//always refresh on URL change
window.addEventListener("hashchange", function () {
addthis.layers.refresh();
});
</script>`
在调用下一个方法后,在角度指令或控制器中调用de $window
对象:$window.addthis.layers.refresh();
答案 5 :(得分:0)
您可能需要在部分中添加脚本标记引用以添加此脚本。那将是最容易解决的问题。
发生的事情是在他们被运行的时候,部分还没有加载,所以他们不会影响任何事情。