Внедрения в Twitter и Instagram отображаются функциями twttr.widgets.load()
и instgrm.Embeds.process()
соответственно, где эти функции запускаются при событии «onload» сценариев, отвечающих за встраивание Twitter и Instagram.
Я заметил, что при переходе на ту же страницу в ioni c исходный код страницы не перерисовывается, как это видно из проверки в браузере.
Я пытался вызвать функции (<any>window)twttr.widgets.load()
и (<any>window)instgrm.Embeds.process()
в ionViewWillEnter()
, ionViewDidEnter()
и ngAfterViewInit()
, но в результате возникла ошибка "невозможно прочитать виджеты свойств undefined"!
Наконец-то я нашел решение!
Кто-то предложил решение для встраивания Twitter в Angular, и оно сработало в c! { ссылка }
Решение состоит в том, чтобы сохранить экземпляр виджета Twitter в объекте (<any>window)
, чтобы иметь возможность снова вызывать принадлежащую ему функцию.
Я применил ту же логику c к встраиваниям в Instagram, и она сработала!
Это мой окончательный код:
twitterRender() {
(<any>window).twttr = (function (d, s, id) {
let js: any, fjs = d.getElementsByTagName(s)[0],
t = (<any>window).twttr || {};
if (d.getElementById(id)) return t;
js = d.createElement(s);
js.id = id;
js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
t._e = [];
t.ready = function (f: any) {
t._e.push(f);
};
return t;
}(document, "script", "twitter-wjs"));
if ((<any>window).twttr.ready())
(<any>window).twttr.widgets.load();
}
instagramRender() {
(<any>window).instagram = function (d, s, id) {
let js: any;
let fjs = d.getElementsByTagName(s)[0],
i = (<any>window).instagram || {};
if (!d.getElementById(id)) {
js = d.createElement(s);
js.setAttribute("onLoad", "window.instgrm.Embeds.process()");
js.id = id;
js.src = "https://platform.instagram.com/en_US/embeds.js";
fjs.parentNode.insertBefore(js, fjs);
i._e = [];
i.ready = function (f: any) {
i._e.push(f);
};
return i;
}
}(document, "script", "instagram-wjs");
if ((<any>window).instagram.ready())
(<any>window).instgrm.Embeds.process();
}
ionViewDidEnter() {
instagramRender();
twitterRender();
}
Но при получении данных из API и внедрении HTML код динамически выглядит так:
this.htmlContent = domSanitizer.bypassSecurityTrustHtml(this.postContent);
instagramRender();
twitterRender();
Для меня встраивания в Twitter и Instagram не отображаются даже при вызове функций после назначения HTML!
Это синхронизация проблема, поскольку кажется, что функции запускаются непосредственно перед загрузкой динамического c HTML содержимого!
Я пытался вызывать функции после div, которому я добавляю ему содержимое HTML загружен. <div (load)="render()" [innerHTML]="htmlContent"></div>
но похоже, что div не имеет события load в ioni c!
Итак, я попытался подождать 200 мс после заполнения содержимого HTML, а затем вызвать функции, и это работал как шарм.
setTimeout(() => {
this.twitterRender();
this.instagramRender();
}, 200);
УСПЕХ !