2017-04-20 67 views
5

我有一个Angular 4 Universal应用程序,我想开始使用格式为JSON-LD的微数据。Angular 2/4/Universal - 如何使用JSON-LD数据?

它采用script标签的一些内容,例如:

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

由于该数据应该按次改变,我正在寻找一种方式来注入对角4.目前的路线改变这个数据, script tags are stripped from templates。与docuemnt.createElement一起使用解决方法时,这不适用于服务器端Angular通用应用程序。

我该怎么做?

EDIT

我使用角4.x.x,其现在被称为纯。 我注入document像这样:

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不兼容,所以目前尚不清楚你的意思。对于Angular 2和Angular 4来说这是非常不同的。你如何使用'document'?它应该像'@Inject(DOCUMENT)document'一样注入,因为在服务器端没有'document' global。答案的质量取决于问题的质量。请参阅http://stackoverflow.com/help/mcve – estus

+0

@estus我更新了问题 – Nicky

+0

@estus,Universal与v4比v2更兼容。 –

回答

1

编辑:在评论中指出,该解决方案是一个哈克的解决方案,并谨慎使用。

您可以注入一些其他类型和函数“getDOM”和“ɵDomAdapter”以获取对dom的引用。对不起,将它称为“一些”服务和功能,因为我不知道为什么他们这样命名。我只看into source code以及角度团队如何使用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'); 
    // .. 

    } 
} 

我测试了这个并在生产中使用它。

+2

''东西是内部的。我相信他们增加了一个不在键盘布局上的符号,特别是指定它不应该从外部意外使用。 'getDOM()'一直是内部的。我很想看到这个问题的答案,但我不明白为什么这不应该与'DOCUMENT'一起工作。这个提供者的存在是为了提供平台无关的'document',我相信[它是为'platform-server'](https://github.com/angular/angular/blob/4.0.0/packages/platform-服务器/ src目录/ server.ts#L80)。 – estus