Добавление фрагмента HTML к представлению в Angular 6

Я получаю фрагмент html-кода из http-запроса во внешнюю систему, и я должен показать это в своем представлении в своем угловом приложении.

чтобы быть точным, это фрагмент html, который я должен показать (он будет немного отличаться для каждого запроса и ответа)

<div 
  id='paysonContainer'
  url='https://test-www.payson.se/embedded/checkout?id=af1ebee5-40bd-410a-90d1-a94401553414'>
</div>

<script 
  type='text/javascript' 
  src='https://test-www.payson.se/embedded/Content/payson.js?v2'>
</script>

Я использовал различные предложения решений, такие как innerHtml , но ни одно из них не работает для меня (возможно, потому, что в моем html-коде есть тег script)

Я получаю фрагмент html в виде строки для компонента и хочу добавить его в представление (например, в div в представлении)


person Yashar    schedule 23.08.2018    source источник
comment
Этот HTML-код, который вы получаете как string из ответа? то вы можете просто сделать так stackblitz.com/edit /   -  person Sivakumar Tadisetti    schedule 23.08.2018
comment
Разве вы не имеете в виду Iframe ?? stackblitz.com/edit/   -  person Ashish Ranjan    schedule 23.08.2018
comment
SPA не предназначены для обработки HTML-кода, исходящего от серверной части. Вместо этого рассмотрите возможность создания пользовательского сценария, который выполняет вызовы AJAX, и объявите его активом вашего проекта.   -  person    schedule 23.08.2018
comment
@JavascriptLover-SKT да, я получаю это как строку внутри компонента (обновил вопрос)   -  person Yashar    schedule 23.08.2018
comment
@AshishRanjan, вы удалили теги скрипта - мне нужно добавить в html-код именно так, как есть. Iframe не решение для меня   -  person Yashar    schedule 23.08.2018
comment
@Yashar, ты проверял стекблиц, который я дал?   -  person Sivakumar Tadisetti    schedule 23.08.2018
comment
@JavascriptLover-SKT, вы показали только URL-адрес внутри iframe и удалили скрипт, это не будет работать таким образом. и я, возможно, получил другую структуру в фрагменте html, и я не могу его разобрать. Я хочу добавить его в html и показать в целом, как есть   -  person Yashar    schedule 23.08.2018
comment
@Yashar Я не использовал iframe, это мой stackblitz stackblitz.com/edit/   -  person Sivakumar Tadisetti    schedule 23.08.2018
comment
@JavascriptLover-SKT вы показываете это как строку на странице, не добавляя ее к исходному коду html   -  person Yashar    schedule 23.08.2018


Ответы (2)


Можно ли этот скрипт завернуть в div?

Если да, то просто используйте синтаксис привязки свойства [innerHTML] к пустому div и используйте str в качестве его значения.

Однако после этого вы получите ошибку небезопасных сценариев, которую вы можете исправить, пропустив ее через канал очистки, который вы можете создать следующим образом:

import {
  Pipe,
  PipeTransform
} from '@angular/core';
import {
  DomSanitizer,
  SafeHtml
} from '@angular/platform-browser';

@Pipe({
  name: 'sanitize'
})
export class SanitizePipe implements PipeTransform {

  constructor(private sanitizer: DomSanitizer) {}

  transform(html: string): SafeHtml {
    return this.sanitizer.bypassSecurityTrustHtml(html);
  }
}

Создание канала поможет вам повторно использовать эту логику в нескольких местах вашего приложения.

И в вашем шаблоне вы можете просто использовать str как:

<div [innerHTML]="str | sanitize">
</div>

Я смог увидеть любой контент из этого div в пользовательском интерфейсе.

введите здесь описание изображения

Даже документация Angular говорит то же самое.

Обойти безопасность и доверять данному значению как безопасному HTML. Используйте это только в том случае, если связанный HTML-код небезопасен (например, содержит теги) и код должен быть выполнен. Дезинфицирующее средство оставит безопасный HTML-код нетронутым, поэтому в большинстве случаев этот метод не следует использовать.

person SiddAjmera    schedule 23.08.2018
comment
да, его можно завернуть в div или что угодно еще, но содержимое должно быть видимым. что-то вроде содержимого в этом iframe stackblitz.com/edit / та же проблема, что и у меня, содержимое не видно. Я не использовал дезинфицирующее средство, но использовал innerHtml и не использовал содержимое. также протестирует ваше решение. вернусь с результатом - person Yashar; 23.08.2018
comment
Хорошо. Так помогает ли этот ответ? Если нет, не могли бы вы обновить свой вопрос, указав проблему после реализации моего решения, и сообщите нам, с какой проблемой вы столкнулись. Если это решение помогло вам, рассмотрите возможность пометить это как ответ. - person SiddAjmera; 23.08.2018
comment
Я не могу видеть какой-либо контент, исключений нет, но в div нет контента - person Yashar; 23.08.2018
comment
У него есть содержание. Вы можете осмотреть его и проверить. Я сделал то же самое и смог увидеть содержимое, когда проверял. Однако я ничего не смог увидеть в пользовательском интерфейсе. - person SiddAjmera; 23.08.2018
comment
кажется, мне нужно обойти не только html, но и обойти SecurityTrustScript и обойтиSecurityTrustUrl. Поскольку у меня есть html, скрипт и URL-адрес в моем html-фрагменте. - person Yashar; 23.08.2018
comment
Я могу видеть содержимое без этого. - person SiddAjmera; 23.08.2018
comment
Я ничего не вижу ни с осмотром, ни без него. соединение дезинфицирующих средств также не работает (похоже, мы не можем связать трубы дезинфицирующего средства). можешь прикрепить ссылку на stackblitz. Благодарность - person Yashar; 23.08.2018
comment
теперь я вижу это в исходном коде html, но он не отображается в пользовательском интерфейсе, как вы решаете эту проблему - person Yashar; 23.08.2018

Вы можете попробовать использовать класс DOMSanitizer

import {BrowserModule, DomSanitizer} from '@angular/platform-browser';

constructor(private sanitizer: DomSanitizer) {
    this.html = sanitizer.bypassSecurityTrustHtml('<div 
  id='paysonContainer'
  url='https://test-www.payson.se/embedded/checkout?id=af1ebee5-40bd-410a-90d1-a94401553414'>
</div>') ;
  }
person Suresh Kumar Ariya    schedule 23.08.2018