Hướng dẫn angular render html from server - góc kết xuất html từ máy chủ

Một thay thế

Nếu bạn tự động hiển thị một số nội dung HTML trong ứng dụng của mình, bạn có thể đã sử dụng InternalHTML, nhưng điều này có thể được thực hiện một cách an toàn hơn không? Hãy cùng xem ví dụ này.example.

Trong ứng dụng này, tôi đã sử dụng thư viện dịch Ngx-dịch. Tôi có một tiêu đề, bộ chọn ngôn ngữ và một liên kết được hiển thị động.ngx-translate. I have a header, language selector, and a dynamically rendered link.

Để tái cấu trúc điều này theo cách tiếp cận mà không có bên trong,innerHtml,

1. Cập nhật từng tệp dịch để có SXM_LINK.TEXT ,,

Với bên tronginnerHtml:

Tôi đang cố gắng lấy HTML từ dịch vụ REST và hiển thị nó bằng cách sử dụng Angular (4.3). Tôi có thể xem dịch vụ được gọi và trả về nội dung chính xác. Tuy nhiên, thành phần góc sử dụng điều này dường như không bao giờ thực sự nhận được nội dung. Tôi đã bỏ lỡ điều gì?

Cụ thể là console.log(html) (trong mẫu mã thứ hai bên dưới) luôn xuất ra null.

Tôi có một dịch vụ góc trông giống như:

@Injectable()
export class SlidesService {

    private requestUrl: string;

    constructor(
        @Inject(AppConfig) private config: AppConfig,
        @Inject(HttpClient) private http: HttpClient) {
        this.requestUrl = this.config.restRoot + listSlidesUrl;
    }


    getSlide(deck: string, slide: string): Observable {

        const headers: HttpHeaders = new HttpHeaders({'Accept': 'text/html'});
        const thisUrl: string = this.requestUrl + '/' + deck + '/' + slide;

        return this.http.get(thisUrl, { headers: headers });
    }
}

Điều này được sử dụng bởi một thành phần:

export class SlidePreviewComponent implements OnInit {

    @Input() slide: string;     /* Identifier for the slide */
    @Input() deck: string;
    slideHtml: string;


    constructor(private slideService: SlidesService) {

      }

    ngOnInit(): void {
        this.slideService.getSlide(this.deck, this.slide)
            .subscribe(html =>  this.setSlideHtml(html) );
    }

    setSlideHtml(html: string) {
        this.slideHtml = html;
        console.log(html);
    }
}

Gói nào @angular/* có liên quan/liên quan đến yêu cầu tính năng?

Trình biên dịch, Core, trình duyệt nền tảng-Dynamic, trình duyệt nền tảng

Sự mô tả

Theo như tôi biết aproach cũ là tiêm Jitcompiler và sử dụng nó để hiển thị HTML của bạn trong một thành phần ẩn danh. Điều này đã làm việc cho đến nay. Tôi sử dụng HTML có thể chỉnh sửa trong DB, sử dụng các tính năng chính làm biến thay thế và các chỉ thị như *NGIF hoặc *ngswitch.

Điều này không hoạt động nữa trong chế độ sản xuất (Angular 12.x) Tôi đã duyệt StackOverflow và các diễn đàn khác để tìm một công việc cho việc này và những thứ này không hoạt động nữa (như tải Jitcompiler vào các nhà cung cấp, dẫn đến việc trình biên dịch JIT JIT không có sẵn.

Như tôi đã tìm thấy không phải là linh hồn cho Ivy/ng 12, tôi đã coi tính năng này vẫn còn thiếu.

Best,

Malte

Giải pháp đề xuất

Thành phần để hiển thị chuỗi HTML.

Example:

Hello!

"

Hiển thị nào trong trường hợp nếu hiển thị là đúng:

Hello!

Các lựa chọn thay thế được xem xét

Một dịch vụ để kết xuất HTML khi đang bay.

E.g.:

Biên dịch HTML P3X-Compile

angular-render-html-once

Thư viện này giúp giữ chuỗi HTML được hiển thị một lần, ngay cả khi ban đầu chúng được hiển thị phía máy chủ.

Bất cứ khi nào kết xuất sẽ xảy ra, và chuỗi HTML đã được hiển thị, kết quả là các yếu tố DOM sẽ được sử dụng lại.

Điều này khá quan trọng khi tích hợp ứng dụng góc với mã bên ngoài được duy trì bởi một số thư viện khác.

Cách sử dụng

Enabing/vô hiệu hóa

Kết xuất một lần được bật theo mặc định. Nếu bạn muốn vô hiệu hóa nó vĩnh viễn, hãy sử dụng phương thức tĩnh RenderHtmlOnceComponent.disable() - nó sẽ ngăn không được bộ nhớ đệm/sử dụng bộ đệm kể từ bây giờ. Phương pháp tĩnh bổ sung RenderHtmlOnce.enable() sẽ cho phép nó một lần nữa.

bootstrap (tùy chọn)

Gọi Phương thức tĩnh không đối thủ RenderHtmlOnceComponent.registerServerSideRenderedComponents() Bất cứ khi nào áp dụng (ví dụ: trong hàm tạo của mô-đun ứng dụng của bạn) để quét nó cho bất kỳ thành phần nào được hiển thị phía máy chủ có thể đã được sử dụng.

Quan trọng: Điều này cần phải được thực hiện trước khi bất kỳ kết xuất góc nào xảy ra, vì điều đầu tiên Angular thực hiện là xóa bất kỳ nội dung hiện có nào của phần tử DOM gốc. this needs to be done before any angular rendering occurs, since first thing angular does is clearing any existing content of root DOM element.

Thành phần

  • Sử dụng thành phần bất cứ nơi nào bạn thường sử dụng Chỉ thị ____10
  • Đầu vào:
    • export class SlidePreviewComponent implements OnInit {
      
          @Input() slide: string;     /* Identifier for the slide */
          @Input() deck: string;
          slideHtml: string;
      
      
          constructor(private slideService: SlidesService) {
      
            }
      
          ngOnInit(): void {
              this.slideService.getSlide(this.deck, this.slide)
                  .subscribe(html =>  this.setSlideHtml(html) );
          }
      
          setSlideHtml(html: string) {
              this.slideHtml = html;
              console.log(html);
          }
      }
      
      1 Yêu cầu - Thuộc tính HTML cũ đơn giản
      export class SlidePreviewComponent implements OnInit {
      
          @Input() slide: string;     /* Identifier for the slide */
          @Input() deck: string;
          slideHtml: string;
      
      
          constructor(private slideService: SlidesService) {
      
            }
      
          ngOnInit(): void {
              this.slideService.getSlide(this.deck, this.slide)
                  .subscribe(html =>  this.setSlideHtml(html) );
          }
      
          setSlideHtml(html: string) {
              this.slideHtml = html;
              console.log(html);
          }
      }
      
      1; bắt buộc để phù hợp với các thành phần bất cứ khi nào chúng có thể bị phá hủy và tạo lại (hoặc được tạo từ phía trình duyệt đầu và khớp với chúng với các đối tác được hiển thị phía máy chủ của chúng)required - plain old HTML
      export class SlidePreviewComponent implements OnInit {
      
          @Input() slide: string;     /* Identifier for the slide */
          @Input() deck: string;
          slideHtml: string;
      
      
          constructor(private slideService: SlidesService) {
      
            }
      
          ngOnInit(): void {
              this.slideService.getSlide(this.deck, this.slide)
                  .subscribe(html =>  this.setSlideHtml(html) );
          }
      
          setSlideHtml(html: string) {
              this.slideHtml = html;
              console.log(html);
          }
      }
      
      1 attribute; required to match components whenever they could be destroyed and created again (or created from scratch browser-side and match them with their server-side rendered counterparts)
    • export class SlidePreviewComponent implements OnInit {
      
          @Input() slide: string;     /* Identifier for the slide */
          @Input() deck: string;
          slideHtml: string;
      
      
          constructor(private slideService: SlidesService) {
      
            }
      
          ngOnInit(): void {
              this.slideService.getSlide(this.deck, this.slide)
                  .subscribe(html =>  this.setSlideHtml(html) );
          }
      
          setSlideHtml(html: string) {
              this.slideHtml = html;
              console.log(html);
          }
      }
      
      3 Yêu cầu - Chuỗi nội dung HTML bạn muốn được nhúng trong thành phầnrequired - HTML content string you wish to have embedded within component
    • export class SlidePreviewComponent implements OnInit {
      
          @Input() slide: string;     /* Identifier for the slide */
          @Input() deck: string;
          slideHtml: string;
      
      
          constructor(private slideService: SlidesService) {
      
            }
      
          ngOnInit(): void {
              this.slideService.getSlide(this.deck, this.slide)
                  .subscribe(html =>  this.setSlideHtml(html) );
          }
      
          setSlideHtml(html: string) {
              this.slideHtml = html;
              console.log(html);
          }
      }
      
      4 (Tùy chọn; Mặc định:
      export class SlidePreviewComponent implements OnInit {
      
          @Input() slide: string;     /* Identifier for the slide */
          @Input() deck: string;
          slideHtml: string;
      
      
          constructor(private slideService: SlidesService) {
      
            }
      
          ngOnInit(): void {
              this.slideService.getSlide(this.deck, this.slide)
                  .subscribe(html =>  this.setSlideHtml(html) );
          }
      
          setSlideHtml(html: string) {
              this.slideHtml = html;
              console.log(html);
          }
      }
      
      5) - Cho phép bật/tắt bộ nhớ đệm của phiên bản cụ thể; Tắt nó trong thời gian chạy cũng xóa bộ đệm liên quan đến thể hiện

Yêu cầu

  • Angular ^8.0.0

Làm cách nào để hiển thị HTML trong Angular 9?

Để hiển thị một chuỗi HTML trong góc, chúng ta có thể sử dụng thuộc tính bên trong bằng cách liên kết một chuỗi với nó.Thuộc tính InsideHTML vệ sinh HTML, để ứng dụng của bạn an toàn trước các cuộc tấn công kịch bản chéo trang (XSS).use the innerHTML property by binding a string to it. The innerHTML property sanitizes the html, so that your app is safe from the cross-site scripting attacks(XSS).

Innerhtml Angular là gì?

Thuộc tính bên trong là thuộc tính phần tử HTML tiêu chuẩn mà góc 14 có thể liên kết với dấu ngoặc vuông tức là [&].a standard HTML element attribute to which Angular 14 can bind with square brackets i.e [ & ] .

Làm cách nào để hiển thị mã HTML trong Angular 4?

Nếu bạn muốn hiển thị mã HTML, bạn có thể sử dụng [InnerText] thay vào đó hoặc chỉ sử dụng phép nội suy chuỗi như @vega lưu ý.Điều đó sẽ thoát khỏi HTML đúng cách.Liên kết với [bên trong] sẽ bảo tồn các lần phá vỡ dòng.use [innerText] instead, or simply use string interpolation as @Vega noted. That will properly escape the HTML. Binding to [innerText] will preserve the line breaks.

Ng ràng buộc html là gì?

Chỉ thị ng-bind-hTML là một cách an toàn để liên kết nội dung với phần tử HTML.a secure way of binding content to an HTML element.