我正在一个基于最新Angular 8版本的网站上工作,我需要使用Ecwid生成的以下代码在我的一个组件上实现Ecwid电子商店页面:
<div id="my-store-24629028"></div>
<div>
<script
data-cfasync="false"
type="text/javascript"
src="https://app.ecwid.com/script.js?24629028&data_platform=code&data_date=2020-02-17"
charset="utf-8"
></script>
<script type="text/javascript">
xProductBrowser(
'categoriesPerRow=3',
'views=grid(20,3) list(60) table(60)',
'categoryView=grid',
'searchView=list',
'id=my-store-24629028',
);
</script>
</div>
Angular生成了组件和
<div id="my-store-24629028"></div>
部分,但是没有脚本被渲染..因此我的电子商店页面没有被渲染。从网上可以找到的角度来看,这是Angular团队的设计选择,但是没有禁用该功能的选项或解决方案吗?我找到的第一个脚本的最接近解决方案是this stackoverflow线程,但是我看不到如何处理Ecwid生成的第二个脚本标签。
更新
TS文件:
import { Component, Renderer2, OnInit, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
@Component({
selector: 'app-shop',
templateUrl: './shop.component.html',
styleUrls: ['./shop.component.scss'],
})
export class ShopComponent implements OnInit {
constructor(private renderer2: Renderer2, @Inject(DOCUMENT) private document: Document) {}
public ngOnInit() {
const script = this.renderer2.createElement('script');
script.type = `text/javascript`;
script.src = 'https://app.ecwid.com/script.js?24629028&data_platform=code&data_date=2020-02-17';
const script2 = this.renderer2.createElement('script');
script2.type = `text/javascript`;
script2.text = `
xProductBrowser(
'categoriesPerRow=3',
'views=grid(20,3) list(60) table(60)',
'categoryView=grid',
'searchView=list',
'id=my-store-24629028',
);
`;
this.renderer2.appendChild(this.document.getElementById('toto'), script);
this.renderer2.appendChild(this.document.getElementById('toto'), script2);
}
}
在遵循@Supporterino建议之后,可悲的是,我设法在HTML中注入了两个脚本,现在我面临着一个变量未定义的错误:
Uncaught ReferenceError: xProductBrowser is not defined
at <anonymous>:2:7
at EmulatedEncapsulationDomRenderer2.push../node_modules/@angular/platform-browser/fesm5/platform-browser.js.DefaultDomRenderer2.appendChild (platform-browser.js:1100)
at DebugRenderer2.push../node_modules/@angular/core/fesm5/core.js.DebugRenderer2.appendChild (core.js:30407)
at ShopComponent.push../src/app/pages/shop/shop.component.ts.ShopComponent.ngOnInit (shop.component.ts:30)
at checkAndUpdateDirectiveInline (core.js:21096)
at checkAndUpdateNodeInline (core.js:29494)
at checkAndUpdateNode (core.js:29456)
at debugCheckAndUpdateNode (core.js:30090)
at debugCheckDirectivesFn (core.js:30050)
at Object.eval [as updateDirectives] (ShopComponent_Host.ngfactory.js? [sm]:1)
解
因此,经过几个小时的尝试来处理脚本,加载@juvs anwser有助于使该实现最终生效!
最终TS文件
import { Component, Renderer2, OnInit, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
@Component({
selector: 'app-shop',
templateUrl: './shop.component.html',
styleUrls: ['./shop.component.scss'],
})
export class ShopComponent implements OnInit {
constructor(private renderer2: Renderer2, @Inject(DOCUMENT) private document: Document) {}
public ngOnInit() {
const storeId = 24629028;
const script = this.renderer2.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('charset', 'utf-8');
script.setAttribute('data-cfasync', 'false');
script.setAttribute('src', `https://app.ecwid.com/script.js?${storeId}&data_platform=code&data_date=2020-02-17`);
script.onload = this.injectEcwidProductBrowser(storeId);
this.renderer2.appendChild(this.document.getElementById('ecwidScriptsSection'), script);
}
private injectEcwidProductBrowser(storeId) {
return () => {
const ecwidBrowserScript = document.createElement('script');
ecwidBrowserScript.setAttribute('type', 'text/javascript');
ecwidBrowserScript.setAttribute('charset', 'utf-8');
ecwidBrowserScript.text = `xProductBrowser("categoriesPerRow=3","views=grid(20,3) list(60) table(60)","categoryView=grid","searchView=list","id=my-store-${storeId}");`;
document.head.appendChild(ecwidBrowserScript);
};
}
}
最终的HTML文件
<div id="my-store-24629028"></div>
<div id="ecwidScriptsSection"></div>
希望这对将来的人有帮助,因为到目前为止,实际上周围没有太多信息,甚至Ecwid支持人员都说他们不支持Angular2&AngularJS ..
最佳答案
加载script.js后,应初始化Ecwid小部件。
Example:
export class AppComponent implements OnInit {
constructor(
private _renderer2: Renderer2,
@Inject(DOCUMENT) private _document: Document
) {}
public ngOnInit() {
let storeId = 24629028;
let script = this._renderer2.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("charset", "utf-8");
script.setAttribute("data-cfasync", "false");
script.setAttribute(
"src",
`https://app.ecwid.com/script.js?${storeId}&data_platform=code&data_date=2020-02-17`
);
script.onload = this.injectEcwidProductBrowser(storeId);
this._renderer2.appendChild(this._document.body, script);
}
private injectEcwidProductBrowser(storeId) {
return function() {
const ecwidBrowserScript = document.createElement("script");
ecwidBrowserScript.setAttribute("type", "text/javascript");
ecwidBrowserScript.setAttribute("charset", "utf-8");
ecwidBrowserScript.text = `xProductBrowser("categoriesPerRow=3","views=grid(20,3) list(60) table(60)","categoryView=grid","searchView=list","id=my-store-${storeId}");`;
document.head.appendChild(ecwidBrowserScript);
};
}
}
关于javascript - 使用脚本标签在Angular 8应用程序上实现Ecwid,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60301866/