2017-04-20 20 views
5

Tôi có ứng dụng Angular 4 Universal và tôi muốn bắt đầu sử dụng microdata theo định dạng JSON-LD.Góc 2/4/Universal - Cách sử dụng dữ liệu JSON-LD?

Nó sử dụng một thẻ script với một số nội dung, ví dụ:

<script type="application/ld+json"> 
{ 
    "@context": "http://schema.org", 
    ... 
} 
</script> 

Kể từ khi dữ liệu này sẽ thay đổi mỗi lần xem, tôi đang tìm một cách để bơm dữ liệu này về biến đổi tuyến đường trong góc 4. Hiện nay, script tags are stripped from templates. Khi sử dụng giải pháp thay thế với docuemnt.createElement, tính năng này không hoạt động trên ứng dụng Angular Universal phía máy chủ.

Tôi làm như thế nào?

EDIT

tôi sử dụng 4.x.x kiễu góc, mà bây giờ được gọi là đồng bằng góc. tôi tiêm document như vậy:

import { DOCUMENT } from '@angular/platform-browser'; 

class Test { 
    constructor(@Inject(DOCUMENT) private _document) { 
    } 

    public createScriptTag() { 
    this._document.createElement('script'); // doesn't work server-side 
    } 
} 
+0

Universal không tương thích với Angular 4, vì vậy không rõ ý bạn là gì. Nó rất khác với Angular 2 và Angular 4. Bạn sử dụng 'document' như thế nào? Nó nên được tiêm như tài liệu '@Inject (DOCUMENT)', vì không có' document' toàn cục ở phía máy chủ. Chất lượng câu trả lời phụ thuộc vào chất lượng của câu hỏi. Xem http://stackoverflow.com/help/mcve – estus

+0

@estus Tôi đã cập nhật câu hỏi – Nicky

+0

@estus, Universal tương thích hơn với v4 so với v2 .. –

Trả lời

1

EDIT: như đã chỉ ra trong các ý kiến, giải pháp này là một giải pháp hacky và được sử dụng một cách thận trọng.

Bạn có thể tiêm một số loại và chức năng khác "ɵgetDOM" và "ɵDomAdapter" để lấy tham chiếu đến dom. Xin lỗi vì đã gọi nó là "một số" dịch vụ và chức năng, bởi vì tôi không có một đầu mối tại sao họ đặt tên nó như thế này. Tôi chỉ cần xem into source code và cách nhóm góc cạnh đang làm việc đó với MetaService.

import { Inject } from '@angular/core'; 
import { Meta, Title } from '@angular/platform-browser'; 
import { ɵgetDOM, ɵDomAdapter, DOCUMENT } from '@angular/platform-browser'; 

@Injectable() 
export class SeoService { 

    private dom: ɵDomAdapter; 

    constructor(@Inject(DOCUMENT) private document: any, 
       private titleService: Title, 
       private metaService: Meta) { 

    this.dom = ɵgetDOM(); 

    let scriptEl = this.dom.createElement('script'); 
    // .. 

    } 
} 

Tôi đã thử nghiệm và sử dụng nó trong quá trình sản xuất.

+2

'ɵ' công cụ là nội bộ. Tôi tin rằng họ đã thêm một biểu tượng không nằm trên bố trí bàn phím đặc biệt để chỉ định rằng nó không nên vô tình được sử dụng từ bên ngoài. 'getDOM()' luôn luôn là nội bộ. Tôi cũng muốn xem câu trả lời cho câu hỏi này, nhưng tôi không thấy lý do tại sao điều này không hoạt động với 'DOCUMENT'. Nhà cung cấp này tồn tại chính xác để cung cấp 'tài liệu' độc lập nền tảng, và tôi tin [nó làm điều đó cho' platform-server'] (https://github.com/angular/angular/blob/4.0.0/packages/platform- server/src/server.ts # L80). – estus

Các vấn đề liên quan