Динамический компонент Angular теряет стиль при встраивании в iframe

Мне нужно получить динамический компонент для встраивания в iframe. Единственный подход, который я видел для достижения этой цели, использует createComponent для динамического создания нового экземпляра данного компонента, а затем перемещает его в тело iframe.

Проблема с этим подходом заключается в том, что стили не переносятся, потому что динамический компонент создается на родительской странице и копируется, но стили внедряются в заголовок родительской страницы и не идут с ней.

Я думаю, что способ решить эту проблему — либо придумать способ вручную перенести сгенерированные стили в iframe, либо каким-то образом сгенерировать компонент внутри самого iframe, чтобы стили отображались внутри.

Вот пример проблемы: https://stackblitz.com/edit/angular-ivy-ajo1gy?file=src/app/app.component.ts

Любые предложения или идеи очень ценятся! Спасибо, что посмотрели!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
800
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю, можете ли вы получить стили, связанные с компонентом, поэтому у вас осталось:

  • создание объекта стиля (плохая идея, хотя)
public ngAfterViewInit(): void {
    setTimeout(() => {
      // get reference to loaded iframe document
      this.frameDoc =
      this.contentFrame.nativeElement.contentDocument ||
      this.contentFrame.nativeElement.contentWindow;
      this.frameDoc.body.appendChild(this.contentRef.location.nativeElement);
      const style = document.createElement("style");
      style.innerHTML = `
      h1 {
        color: blue;
      }
      `;
      this.frameDoc.body.appendChild(style);
    }, 1000);
  }
@Component({
  selector: "hello",
  template: `<h1 [style.color] = "'blue'">Content Window - I should be blue</h1>`
})
export class HelloComponent {}
@Component({
  selector: "hello",
  template: `
    <h1 [ngStyle] = "{'color': 'blue'}">Content Window - I should be blue</h1>`,
})
export class HelloComponent {}

У меня были разные результаты с разными подходами, особенно в разных браузерах и на разных платформах. В конце концов, я просто использовал встроенные стили в самом шаблоне с интерполяцией шаблона для геттеров, где нужны были динамические значения. Не самый чистый подход, но если вы уже используете iframe для скрытия альтернативных шаблонов, я думаю, вы уже попали в кроличью нору.

Jordan Steinberg 15.06.2021 02:32

Другие вопросы по теме