как добавить каноническую ссылку в угловую 5 - PullRequest
0 голосов
/ 07 июня 2018

Как добавить каноническую ссылку в угловую 5 динамически

<link rel="canonical" href="http://foobar.com/gotcah"/>

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Столкнувшись с той же проблемой, я искал вокруг и нашел руководство о том, как это сделать:

https://www.concretepage.com/angular/angular-title-service-and-canonical-url

Он использует Angular 6, но я думаю, что он обратно совместим с5.

В основном предлагается создание службы (SEOService) для облегчения создания канонической ссылки везде, где она вводится.Он внедряет объект Angular DOCUMENT в службу и создает элемент канонической ссылки как HTMLLinkElement.

. Он заботится о том, чтобы решение было удобным для рендеринга / рендеринга на стороне сервера - так что, если вы хотите лучшеКонтролируйте свой SEO для страниц в вашем приложении, я считаю, что это то, что вы хотите.

Вот минимальное переписывание сервиса из статьи:

seo.service.ts

import { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';

@Injectable({
  providedIn: 'root'
})
export class SeoService { 

  constructor(@Inject(DOCUMENT) private doc) {}

  createLinkForCanonicalURL() {
     let link: HTMLLinkElement = this.doc.createElement('link');
     link.setAttribute('rel', 'canonical');
     this.doc.head.appendChild(link);
     link.setAttribute('href', this.doc.URL);
   }
} 

И вот переписывание компонента, потребляющего услугу:

data.component.ts

import { Component, OnInit } from '@angular/core';
import { SeoService } from './seo.service';

@Component({
  selector: 'app-data',
  templateUrl: './data.component.html'
})
export class DataComponent implements OnInit {

  constructor(private seoService: SEOService) { }

  ngOnInit() {
    this.createLinkForCanonicalURL();
  }

  createLinkForCanonicalURL() {
    this.seoService.createLinkForCanonicalURL();
  } 
}

Youмог бы просто иметь метод createLinkForCanonicalURL(), принимающий необязательный параметр URL, который вы хотели бы использовать в качестве канонической ссылки для страницы, для полного контроля.

0 голосов
/ 07 июня 2018

Я получил решение, создайте службу ссылок (например: link.service.ts) и вставьте следующий код:

import { Injectable, Optional, RendererFactory2, ViewEncapsulation, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';

@Injectable()
export class LinkService {

constructor(
    private rendererFactory: RendererFactory2,
    @Inject(DOCUMENT) private document
) {
}

/**
 * Inject the State into the bottom of the <head>
 */
addTag(tag: LinkDefinition, forceCreation?: boolean) {

    try {
        const renderer = this.rendererFactory.createRenderer(this.document, {
            id: '-1',
            encapsulation: ViewEncapsulation.None,
            styles: [],
            data: {}
        });

        const link = renderer.createElement('link');
        const head = this.document.head;
        const selector = this._parseSelector(tag);

        if (head === null) {
            throw new Error('<head> not found within DOCUMENT.');
        }

        Object.keys(tag).forEach((prop: string) => {
            return renderer.setAttribute(link, prop, tag[prop]);
        });

        // [TODO]: get them to update the existing one (if it exists) ?
        renderer.appendChild(head, link);

    } catch (e) {
        console.error('Error within linkService : ', e);
    }
}

private _parseSelector(tag: LinkDefinition): string {
    // Possibly re-work this
    const attr: string = tag.rel ? 'rel' : 'hreflang';
    return `${attr}="${tag[attr]}"`;
}
}

 export declare type LinkDefinition = {
  charset?: string;
  crossorigin?: string;
  href?: string;
  hreflang?: string;
  media?: string;
  rel?: string;
  rev?: string;
  sizes?: string;
  target?: string;
  type?: string;
} & {
    [prop: string]: string;
};

Служба импорта в компонент:

import { LinkService } from '../link.service';

constructor(private linkService: LinkService) {

this.linkService.addTag( { rel: 'canonical', href: 'url here'} );
}

пожалуйстасм. ссылку ниже:

https://github.com/angular/angular/issues/15776

...