javascript – 在Angular组件模板中添加脚本标记
作者:互联网
Angular2删除< script>自动从模板中标记以阻止人们使用此功能作为“poor’s man” loader.
这里的问题是脚本标签目前比仅加载代码或其他脚本文件有更多的用途.围绕< script>的进一步功能有可能.标签也将在未来推出.
目前使用的是JSON-LD,它采用的格式
<script type="application/ld+json">
{
"@context":"http://schema.org",
"@type":"HealthClub",
...
}
</script>
通常建议的解决方法是通过ngAfterViewInit挂钩到文档的dynamically add script tags,但这显然不是正确的ng2练习,并且不能在服务器端工作,JSON-LD显然需要能够做到.
是否有任何其他解决方法可用于包含< script> angular2模板中的标签(即使标签在浏览器中是惰性的),还是这个框架过于自以为是?如果在angular2中无法解决这种情况,可能还有哪些其他解决方案?
解决方法:
也许这里的派对有点晚了,但由于上述答案与Angular SSR不兼容(例如文档未定义服务器端或document.createElement不是函数),我决定编写一个适用于Angular的版本4,在服务器和浏览器上下文中:
组件实现
import { Renderer2, OnInit, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
class MyComponent implements OnInit {
constructor(
private _renderer2: Renderer2,
@Inject(DOCUMENT) private _document: Document
) { }
public ngOnInit() {
let s = this._renderer2.createElement('script');
s.type = `application/ld+json`;
s.text = `
{
"@context": "https://schema.org"
/* your schema.org microdata goes here */
}
`;
this._renderer2.appendChild(this._document.body, s);
}
}
服务实施
注意:服务不能直接使用Renderer2.实际上,渲染元素应该由Component完成.但是,您可能会发现自己处于要在页面上自动创建JSON-LD脚本标记的情况.作为示例,情况可以是在路线导航改变事件上调用这样的功能.因此,我决定添加一个在Service上下文中工作的版本.
import { Renderer2, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
/**
* Use a Service to automate creation of JSON-LD Microdata.
*/
class MyService {
constructor(
@Inject(DOCUMENT) private _document: Document
) { }
/**
* Set JSON-LD Microdata on the Document Body.
*
* @param renderer2 The Angular Renderer
* @param data The data for the JSON-LD script
* @returns Void
*/
public setJsonLd(renderer2: Renderer2, data: any): void {
let s = renderer2.createElement('script');
s.type = 'application/ld+json';
s.text = `${JSON.stringify(data)}`;
renderer2.appendChild(this._document.body, s);
}
}
标签:json-ld,javascript,angular,angular2-universal 来源: https://codeday.me/bug/20190918/1810664.html