Я работаю на веб-сайте, основанном на последней версии 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 Team, но нет ли варианта или решения, чтобы отключить это?
Наиболее близким решением для первого найденного мной сценария является этот поток 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 помог этой реализации окончательно заработать!
Final TS File
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 ..