用于社交共享的动态元标签 Angular 6+ 通用

问题描述 投票:0回答:2

我想这个问题已经被问了太多次了,因为我已经浏览了几乎所有与此相关的可能问题。

简化我的需求:我想为我的网站创建社交分享按钮,该网站使用 Angular 7 并具有通用的正确设置。

详细信息:我正在寻找一种解决方案,允许我动态更新 Facebook、Twitter 和其他社交媒体平台的元标签,这样当我单击共享按钮时,我应该共享特定于当前文章的内容在视图中。 重要提示:这些元标记的数据是通过 API 调用获取的,因此 解决方案不能包含硬编码数据。

尝试过的解决方案:我尝试了使用“@angular/platform-browser”中的Meta的解决方案,但结果是它在DOM已经渲染后更新了标签。

我的组件的 ngOnInit 有以下内容:

this.musicService.getTrackInfo(track._id)
                .subscribe(track => {  
            this.metaService.setTag('og:title', track.name);
            this.metaService.setTag('og:type', 'music.song'); });

研究成果:

类似未解决的问题:

有人可以为这个问题提供完整的、逐步的解决方案,并解释为什么当前使用 Meta 的方法不起作用。

angular client-side meta-tags angular-universal server-side-rendering
2个回答
0
投票

使用 updateTag 对我来说确实有效。 在index.html中,我添加了所有没有值的标签,即

<meta name="description" content="">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="">
<meta name="twitter:description" content="">
<meta name="twitter:image" content="">

我还添加了这样的动态值:

this.meta.updateTag({
        name: 'twitter:description', content: *value from api*
      });

0
投票

第 1 步:在主 index.html 页面中设置默认标签

<meta name="og:title" content="Website Title" />
<meta name="og:site_name" content="Website Name" />
<meta name="og:description" content="Your default website description goes here" />
<meta name="og:image" content="https://www.example.com/images/social/default.jpg" />
<meta name="og:type" content="website" />
<meta name="og:url" content="https://www.example.com" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Website Title" />
<meta name="twitter:description" content="Your default website description goes here" />
<meta name="twitter:image" content="https://www.example.com/images/social/default.jpg" />

第 2 步:将以下代码添加到要更改元标记的页面的组件中

//Add this to your imports in your component
import {Meta, Title} from '@angular/platform-browser';

//Angular component add a constructor
pageTitle = "About Us";
pageDesc = "This is a page about us";
pageSocialImage = "https://www.example.com/images/social/aboutus.jpg";

constructor(private titleService:Title, private meta: Meta) {
  this.titleService.setTitle(this.pageTitle);

  this.meta.updateTag({ name: 'description', content: this.pageDesc },`name='description'`); //The second parameter IS NECESSARY to do the update
  this.meta.updateTag({ name: 'og:title', content: this.pageTitle },`name='og:title'`);
  this.meta.updateTag({ name: 'og:description', content: this.pageDesc },`name='og:description'`);
  this.meta.updateTag({ name: 'og:image', content: this.pageSocialImage },`name='og:image'`);
  this.meta.updateTag({ name: 'og:url', content: "https://www.example.org/about-us" },`name='og:url'`);
  this.meta.updateTag({ name: 'twitter:title', content: this.pageTitle },`name='twitter:title'`);
  this.meta.updateTag({ name: 'twitter:description', content: this.pageDesc },`name='twitter:description'`);
  this.meta.updateTag({ name: 'twitter:image', content: this.pageSocialImage },`name='twitter:image'`);
}

不要运行代码片段。我没有把一切都连接起来。只需尝试一下,然后使用浏览器开发工具检查 DOM,即可在更改路由时查看元标记的切换。

这是我获得帮助的地方:https://www.digitalocean.com/community/tutorials/angular-meta-tags

© www.soinside.com 2019 - 2024. All rights reserved.