【问题标题】:Angular 2 / 4 / Universal - How to use JSON-LD data?Angular 2 / 4 / Universal - 如何使用 JSON-LD 数据?
【发布时间】:2017-09-17 06:08:00
【问题描述】:

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

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

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

由于此数据应按视图更改,因此我正在寻找一种方法将这些数据注入到 Angular 4 中的路由更改中。目前,script tags are stripped from templates。当使用docuemnt.createElement 的解决方法时,这在服务器端 Angular Universal 应用程序上不起作用。

我该怎么做?

编辑

我使用 Angular 4.x.x,现在称为普通 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
  }
}

【问题讨论】:

  • Universal 与 Angular 4 不兼容,因此不清楚您的意思。 Angular 2 和 Angular 4 非常不同。你如何使用document?它应该像@Inject(DOCUMENT) document 一样注入,因为服务器端没有document 全局。答案的质量取决于问题的质量。见stackoverflow.com/help/mcve
  • @estus 我更新了问题
  • @estus,Universal 与 v4 比与 v2 更兼容..
  • @SamVloeberghs 所指的“通用”应该有明显的区别。 github.com/angular/universal 与 A4 不兼容。尽管文档当前将其描述为“通用”angular.io/docs/ts/latest/guide/universal.html,但实际上它只是platform-server
  • @estus,还是错了。github.com/angular/universal/tree/master/modules/… 是您在快速应用程序中使用角度引擎的方法。我在生产中使用它并使用 v4 .. :)

标签: javascript angular typescript angular-universal


【解决方案1】:

编辑:正如 cmets 中所指出的,此解决方案是一个 hacky 解决方案,请谨慎使用。

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

  }
}

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

【讨论】:

  • ɵ 东西是内部的。我相信他们添加了一个不在键盘布局上的符号,特别是指定它不应该从外部意外使用。 getDOM() 一直是内部的。我也有兴趣看到这个问题的答案,但我不明白为什么这不适用于DOCUMENT。这个提供者的存在正是为了提供独立于平台的document,我相信it does that for platform-server
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2018-04-17
  • 2018-02-07
  • 2018-07-03
  • 2023-03-03
  • 2018-01-02
  • 2017-10-05
相关资源
最近更新 更多