angualr6: атрибут iframe src обновляется, но pdf не отображается несколько раз

#angular #iframe #blob

#angular #iframe #большой двоичный объект

Вопрос:

Ниже приведен код, который я написал, файл Pdf отображается один раз и не отображается один раз (не удалось загрузить pdf). Я также заменил на iFrame, по тому же сценарию. Иногда отображается pdf, иногда нет. Кто-нибудь может мне помочь.

Мой HTML-элемент:

        <embed [src]="pdf.pdfSource | safe" type="application/pdf">
  

Мой Ts-код:

   var blob = new Blob([response.collection], {
        type: 'application/pdf'
      });
      var url = URL.createObjectURL(response);
      self.pdf.pdfSource = url;
  

Я создал безопасный канал, как показано ниже

 import { Component, ViewEncapsulation, ViewChild, ElementRef, PipeTransform, Pipe, OnInit } from '@angular/core';
   import { DomSanitizer } from "@angular/platform-browser";

   @Pipe({ name: 'safe' })
       export class SafePipe implements PipeTransform {
          constructor(private sanitizer: DomSanitizer) { }
            transform(url) {        
              return this.sanitizer.bypassSecurityTrustResourceUrl(url);
            }
   }
  

Ответ №1:

Я бы предпочел создать пользовательский компонент для обработки такого требования:

Создайте объект-embed component и передайте исходный URL и введите его в качестве input атрибутов. Это будет обновляться каждый раз, когда происходит изменение входных значений для компонента.

Пример:

 import { Component, Input, OnChanges, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';

@Component({
    selector: 'object-embed',
    template: `<div [innerHTML]="safeHtml"></div>`,
    changeDetection: ChangeDetectionStrategy.OnPush
})
export class ObjectEmbedComponent implements OnChanges {
    @Input() srcUrl: string;
    @Input() embedType: string;
    public safeHtml: SafeHtml;

    ngOnChanges() {

       let html = '';
       if(this.embedType ==='application/pdf'){
           html = '<embed src="${this.srcUrl} type="${this.embedType}">'
       }
       this.safeHtml = this.getSafeHtml(html);
   }


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

}
  

И используйте этот компонент:

 <object-embed [embedType]="pdf" [srcUrl]="document-url-here"/>
  

Теперь эти значения можно передавать с использованием объекта / переменной, определенной в родительском компоненте, или напрямую. если у вас есть объект docDetails с этими значениями, вы можете использовать его следующим образом (при условии, что у него есть свойства docType и docUrl :

 <object-embed [embedType]="docDetails.docType" [srcUrl]="docDetails.docUrl"/>
  

Комментарии:

1. Нужно ли мне создавать входные переменные для embedType и srcUrl в родительском компоненте, который содержит <object-embed [embedType]=»pdf» [srcUrl]=»document-url-here»/>

2. Нет, Input уже определено в object-embed , вам просто нужно убедиться, что родительский компонент использует object-embed и предоставляет ему необходимые данные, которые являются srcUrl и типом носителя. Пример: <object-embed [embedType]="application/pdf" [srcUrl]="document-url-here"/>

3. вы также можете использовать тот же компонент <iframe src="${this.srcUrl}"... для html

4. внедрить как ell, поскольку obejct не работает onChanges() { let html = «; html = ‘<внедрить src=»‘ this.srcUrl ‘» type=»application / pdf» >’; Бесполезно.

5. иногда приходит, иногда pdf не приходит