Les résultats de la recherche dans google sont affichés via TitleTag et le <meta name="description"..."/>
Tag. Le <title>
- La balise est modifiable via Angular2 comment changer le titre de la page dans le routeur angular2
Ce qui reste est la description.
Est-il possible d'écrire une directive en angular2, qui manipule les méta-tags dans le <head>
une partie de ma page.
Donc, selon l'itinéraire sélectionné, la méta description change comme:
<meta name="description" content="**my description for this route**"/>
Depuis Angular4, vous pouvez utiliser Angular Meta service .
import { Meta } from '@angular/platform-browser';
// [...]
constructor(private meta: Meta) {}
// [...]
this.meta.addTag({ name: 'robots', content: 'noindex' });
C'est possible. Je l'ai implémenté dans mon application et ci-dessous, je fournis la description de sa fabrication.
L'idée de base est d'utiliser Meta
à partir de @angular/platform-browser
Pour changer dynamiquement une balise META particulière, vous devez:
removeTag(attrSelector: string) : void
.addTag(tag: MetaDefinition, forceCreation?: boolean) : HTMLMetaElement
.Et vous devez le faire lorsque le routeur déclenche un événement de changement de route.
Remarque: En fait, il est également nécessaire d'avoir par défaut <title>...</title>
Et <meta name="description"..." content="..."/>
Dans la tête de index.html donc avant qu'il ne soit défini dynamiquement il y a déjà du contenu statique.
Mon contenu app-routing.module.ts
:
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/mergeMap';
import { NgModule } from '@angular/core';
import { RouterModule, Routes, Router, NavigationEnd, ActivatedRoute } from '@angular/router';
import { StringComparisonComponent } from '../module-string-comparison/string-comparison.component';
import { ClockCalculatorComponent } from '../module-clock-calculator/clock-calculator.component';
import { Title, Meta } from '@angular/platform-browser';
const routes: Routes = [
{
path: '', redirectTo: '/string-comparison', pathMatch: 'full',
data: { title: 'String comparison title', metaDescription: 'String comparison meta description content' }
},
{
path: 'string-comparison', component: StringComparisonComponent,
data: { title: 'String comparison title', metaDescription: 'String comparison meta description content' }
},
{
path: 'clock-time-calculator', component: ClockCalculatorComponent,
data: { title: 'Clock time calculator title', metaDescription: 'Clock time calculator meta description content' }
}
];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [ RouterModule ]
})
export class AppRoutingModule {
constructor(
private router: Router,
private activatedRoute: ActivatedRoute,
private titleService: Title,
private metaService: Meta
){
//Boilerplate code to filter out only important router events and to pull out data object field from each route
this.router.events
.filter(event => event instanceof NavigationEnd)
.map(() => this.activatedRoute)
.map(route => {
while (route.firstChild) route = route.firstChild;
return route;
})
.filter(route => route.outlet === 'primary')
//Data fields are merged so we can use them directly to take title and metaDescription for each route from them
.mergeMap(route => route.data)
//Real action starts there
.subscribe((event) => {
//Changing title
this.titleService.setTitle(event['title']);
//Changing meta with name="description"
var tag = { name: 'description', content: event['metaDescription'] };
let attributeSelector : string = 'name="description"';
this.metaService.removeTag(attributeSelector);
this.metaService.addTag(tag, false);
});
}
}
data
supplémentaire pour chaque route. Il contient des chaînes title
et metaDescription
qui seront utilisées comme contenu de titre et de balise Meta.if statements
Et loops
peuvent être utilisés à la place du flux, du filtre et de la carte.title
et metaDescription
.<title>...</title>
Et <meta name="description"..." content="..."/>
.Effets:
En fait, j'utilise actuellement une version un peu plus sophistiquée de cette solution qui utilise également ngx-translate pour afficher différents titres et méta descriptions pour différentes langues.
Le code complet est disponible dans le projet angular2-bootstrap-translate-website-starter .
Le fichier app-routing.module.ts
Avec la solution ngx-translate est exactement là: app-routing.module.ts .
Il y a aussi l'application de production qui utilise la même solution: http://www.online-utils.com .
Ce n'est certainement pas le seul moyen et il pourrait y avoir de meilleures façons de le faire. Mais j'ai testé cette solution et ça marche.
En fait, la solution est très similaire à celle de l'article correspondant sur le changement de titre: Comment changer le titre de la page dans le routeur angular2 .
Angular Meta docs: https://angular.io/docs/ts/latest/api/platform-browser/index/Meta-class.html . En fait, ils ne sont pas très informatifs et j'ai dû expérimenter et étudier le vrai code .js pour faire fonctionner ce méta-changement dynamique.
J'ai développé et je viens de publier @ ngx-meta/core plugin, qui manipule les balises meta au niveau de la route, et permet de définir les balises meta par programmation dans le constructeur du composant.
Vous pouvez trouver des instructions détaillées sur @ ngx-meta/core dépôt github. De plus, les fichiers source peuvent être utiles pour introduire une logique personnalisée.
Il n'y a actuellement aucune solution prête à l'emploi, seulement un problème ouvert pour l'implémenter https://github.com/angular/angular/issues/7438 .
Vous pouvez bien sûr implémenter vous-même quelque chose comme le service de titre, utilisez simplement TitleService comme modèle
Un service Meta
similaire au service Title
est en cours de réalisation (actuellement seulement une pull request).