使用指令将小部件集成到 angular 应用程序中
Integrating widget into a angular app using a directive
所以我目前已经将 Yotpo 'reviews and comments' 集成到我的 Angular 应用程序中。
它由一个 javascript 小部件和一些 Html:
Js:
var e=document.createElement("script");
e.type="text/javascript",
e.async=true,
e.src="//staticw2.yotpo.com/API/widget.js",
e.id="test";
var t=document.getElementsByTagName("script")[0];
t.parentNode.insertBefore(e,t);
HTML:
<div class="yotpo yotpo-main-widget"
data-product-id="{{ product.sku }}"
data-name="{{ product.title }}"
data-url="{{ pageUrl }}"
data-image-url="{{ pageImage }}"
data-description="{{ product.description }}">
</div>
通过将 JS 放入指令中,我让它工作了,但是,它只有在您重新加载页面时才会工作。
为了尝试解决此问题,我在用户离开页面时删除脚本,并在用户返回页面时重新插入脚本
示例:
link: function ($scope, elem) {
elem.bind('$destroy', function() {
var widgetScript = angular.element('#foo');
jQuery(WidgetScript).remove();
});
function loadWidget() {
var e=document.createElement("script");
e.type="text/javascript",
e.async=true,
e.src="//staticw2.yotpo.com/API/widget.js",
e.id="foo";
var t=document.getElementsByTagName("script")[0];
t.parentNode.insertBefore(e,t);
}
loadWidget();
}
不幸的是,这不起作用。任何建议将不胜感激。
您不需要指令即可完成这项工作。
widget.js 脚本使用 HTML 中的数据属性。
您需要确保在加载 javascript 之前设置这些数据属性。
我还建议您对属性使用单向绑定。
所以我找到了一个解决方案,我想我会 post 在这里,因为我相信如果其他人使用 Yotpo 和 Angular 毫无疑问会遇到这个问题。
答案是yotpo.initWidgets();
遗憾的是,Yotpo 的文档中没有关于此的信息。
所以这就是我最终所做的,而且效果很好:
.directive('yotpo', function ($document, $timeout) {
return {
restrict: 'AE',
link: function() {
function loadWidget() {
var e = document.createElement("script");
e.type = "text/javascript",
e.async = true,
e.src = "//staticw2.yotpo.com/API/widget.js",
e.id = "test";
var t = document.getElementsByTagName("script")[0];
t.parentNode.insertBefore(e,t);
}
loadWidget();
if (typeof yotpo !== 'undefined') {
$timeout(function () {
yotpo.initWidgets();
}, 500)
}
}
}
所以我目前已经将 Yotpo 'reviews and comments' 集成到我的 Angular 应用程序中。
它由一个 javascript 小部件和一些 Html:
Js:
var e=document.createElement("script");
e.type="text/javascript",
e.async=true,
e.src="//staticw2.yotpo.com/API/widget.js",
e.id="test";
var t=document.getElementsByTagName("script")[0];
t.parentNode.insertBefore(e,t);
HTML:
<div class="yotpo yotpo-main-widget"
data-product-id="{{ product.sku }}"
data-name="{{ product.title }}"
data-url="{{ pageUrl }}"
data-image-url="{{ pageImage }}"
data-description="{{ product.description }}">
</div>
通过将 JS 放入指令中,我让它工作了,但是,它只有在您重新加载页面时才会工作。
为了尝试解决此问题,我在用户离开页面时删除脚本,并在用户返回页面时重新插入脚本
示例:
link: function ($scope, elem) {
elem.bind('$destroy', function() {
var widgetScript = angular.element('#foo');
jQuery(WidgetScript).remove();
});
function loadWidget() {
var e=document.createElement("script");
e.type="text/javascript",
e.async=true,
e.src="//staticw2.yotpo.com/API/widget.js",
e.id="foo";
var t=document.getElementsByTagName("script")[0];
t.parentNode.insertBefore(e,t);
}
loadWidget();
}
不幸的是,这不起作用。任何建议将不胜感激。
您不需要指令即可完成这项工作。
widget.js 脚本使用 HTML 中的数据属性。 您需要确保在加载 javascript 之前设置这些数据属性。
我还建议您对属性使用单向绑定。
所以我找到了一个解决方案,我想我会 post 在这里,因为我相信如果其他人使用 Yotpo 和 Angular 毫无疑问会遇到这个问题。
答案是yotpo.initWidgets();
遗憾的是,Yotpo 的文档中没有关于此的信息。
所以这就是我最终所做的,而且效果很好:
.directive('yotpo', function ($document, $timeout) {
return {
restrict: 'AE',
link: function() {
function loadWidget() {
var e = document.createElement("script");
e.type = "text/javascript",
e.async = true,
e.src = "//staticw2.yotpo.com/API/widget.js",
e.id = "test";
var t = document.getElementsByTagName("script")[0];
t.parentNode.insertBefore(e,t);
}
loadWidget();
if (typeof yotpo !== 'undefined') {
$timeout(function () {
yotpo.initWidgets();
}, 500)
}
}
}