Angular 2/4/Universal - 如何使用JSON-LD数据?

Nic*_*cky 5 javascript typescript angular-universal angular

我有一个Angular 4 Universal应用程序,我想开始使用JSON-LD格式的微数据.

它使用script带有一些内容的标签,例如:

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  ...
}
</script>
Run Code Online (Sandbox Code Playgroud)

由于此数据应该按视图更改,我正在寻找一种方法在Angular 4中将路径更改注入此数据.目前,脚本标记从模板中删除.使用变通方法时docuemnt.createElement,这不适用于服务器端的Angular Universal应用程序.

我该怎么做?

编辑

我使用Angular 4.xx,现在称为普通Angular.我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
  }
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*ghs 1

编辑:正如评论中所指出的,该解决方案是一个 hacky 解决方案,应谨慎使用。

\n\n

您可以注入一些其他类型和函数“\xc9\xb5getDOM”和“\xc9\xb5DomAdapter”来获取对 dom 的引用。很抱歉将其称为“某些”服务和功能,因为我不知道他们为什么这样命名。我只是研究了源代码以及 Angular 团队如何使用 MetaService 来实现这一点。

\n\n
import { Inject } from \'@angular/core\';\nimport { Meta, Title } from \'@angular/platform-browser\';\nimport { \xc9\xb5getDOM, \xc9\xb5DomAdapter, DOCUMENT } from \'@angular/platform-browser\';\n\n@Injectable()\nexport class SeoService {\n\n  private dom: \xc9\xb5DomAdapter;\n\n  constructor(@Inject(DOCUMENT) private document: any,\n              private titleService: Title,\n              private metaService: Meta) {\n\n    this.dom = \xc9\xb5getDOM();\n\n    let scriptEl = this.dom.createElement(\'script\');\n    // ..\n\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经对此进行了测试并在生产中使用它。

\n

  • `ɵ` 的东西是内部的。我相信他们添加了一个不在键盘布局上的符号,特别是为了指定它不应该从外部意外使用。`getDOM()` 一直是内部的。我也有兴趣看到这个问题的答案,但我不明白为什么这不适用于“文档”。这个提供程序的存在正是为了提供独立于平台的“文档”,我相信[它为“平台服务器”做到了这一点](https://github.com/angular/angular/blob/4.0.0/packages/platform-服务器/src/server.ts#L80)。 (2认同)