2017-04-20 10 views
5

Angular 4 Universal uygulamasına sahibim ve mikro verileri JSON-LD biçiminde kullanmaya başlamak istiyorum. Bu veri görünümünde başına değişmelidir beri, Şu Açısal 4'te rota değişikliği bu verileri enjekte etmek için bir yol arıyorumKöşeli 2/4/Evrensel - JSON-LD verileri nasıl kullanılır?

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

:

Bu örneğin bazı içeriğe sahip bir script etiketini kullanır script tags are stripped from templates. docuemnt.createElement ile bir geçici çözüm kullanırken, bu sunucu tarafı Angular Evrensel uygulamasında çalışmaz.

Bunu nasıl yaparım?

DÜZENLEME

Şimdi düz Açısal olarak adlandırılır Açısal 4.x.x kullanın. ben şöyle document enjekte:

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, Angular 4 ile uyumlu değildir, bu yüzden tam olarak ne demek istediğinizi net olarak belirtmez. Açısal 2 ve Açısal 4 için çok farklı. 4. "Belgeyi" nasıl kullanıyorsunuz? Sunucu tarafında 'document' global olmadığı için' Inject (DOCUMENT) 'gibi bir belgeye enjekte edilmelidir. Cevap kalitesi, sorunun kalitesine bağlıdır. Bkz. Http://stackoverflow.com/help/mcve – estus

+0

@estus Soru – Nicky

+0

@estus güncellemesini yaptım, Universal v2 ile kıyaslandığında v4 ile daha uyumludur .. –

cevap

1

EDIT: Açıklamalarda belirttiği gibi bu çözümler Bir Hacky çözümdür ve dikkatli kullanılmalıdır.

Başka bir tür enjekte edebilir ve dom dosyasına bir başvuru almak için "ɵgetDOM" ve "ɵDomAdapter" işlevlerini kullanabilirsiniz. "Bazı" servis ve işlevini çağırdığım için özür dilerim, çünkü neden böyle adlandırdıklarına dair bir ipucum yok. Sadece into source code'a baktım ve açısal ekibin MetaService ile nasıl çalıştığını gördüm.

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'); 
    // .. 

    } 
} 

Bunu test ettim ve üretimde kullanıyorum.

+2

'ɵ' içeride. Özellikle dışarıdan yanlışlıkla kullanılmaması gerektiğini belirtmek için klavye düzeninde olmayan bir sembol eklediklerine inanıyorum. getDOM() 'her zaman dahili olmuştur. Ben de bu sorunun cevabını görmekle ilgileniyorum, ancak bunun neden “BELGE” ile çalışmaması gerektiğini gösteren sebepler görmüyorum. Bu sağlayıcı, platformdan bağımsız 'belge' sağlamak için tam olarak var ve ben [platform-sunucu için bunu yapıyor] (https://github.com/angular/angular/blob/4.0.0/packages/platform- sunucu/src/server.ts # L80). – estus

İlgili konular