2013-11-09 17 views
6

Come impostare il titolo HTML quando si utilizza Iron-Router? Ecco cosa mi piacerebbe fare:Impostare il titolo HTML quando si utilizza il router ferro

<template name="layout"> 
    <head><title>{{KAZOOM}}</title></head> 
    <body> 
     {{> menu}} 
     {{yield}} 
    </body> 
</template> 

<template name="example"> 
    {{KAZOOM 'example page'}} 
    That's just an example page 
</template> 

<template name="foo"> 
    {{KAZOOM 'foo page'}} 
    Another example page with different HTML title 
</template> 

Tu vedi la KAZOOM viaggia indietro nel tempo per impostare il titolo HTML? La ragione per cui desidero farlo in questo modo è che considero il titolo HTML come parte del contenuto. Sarebbe bello poter regolare il titolo HTML di una pagina semplicemente modificando il modello che lo ha generato. Sfortunatamente non vedo un modo pulito per raggiungere questo obiettivo. Il più vicino a cui posso pensare si chiamerebbe yield, quindi il titolo verrebbe impostato dalla rotta, non dal modello.

L'altra possibilità è quella di rinunciare solo il modello di layout e comprendono sempre un colpo di testa:

<template name="head"> 
    <head><title>{{this}}</title></head> 
    {{> menu}} 
</template> 

<template name="example"> 
    {{> head 'example page'}} 
    That's just an example page 
</template> 

<template name="foo"> 
    {{> head 'foo page'}} 
    Another example page with different HTML title 
</template> 

Questo non è molto bello. Hai una soluzione adeguata a questo?

+1

La risposta può essere trovata qui: http://stackoverflow.com/questions/14036248/meteor-setting-the-document-title –

risposta

16

Set document.title onAfterRun nel router Ferro:

var pageTitle = 'My super web'; 
Router.map(function() { 
    this.route('user', { 
     onAfterRun: function() { 
     document.title = 'User ' + this.params.name + ' - ' + pageTitle; 
     } 
    }); 
}); 

EDIT:

Se si desidera impostare il titolo nel modello, creare personalizzato Manubrio helper (codice cliente):

Handlebars.registerHelper("KAZOOM", function(title) { 
    if(title) { 
     document.title = title; 
    } else { 
     document.title = "Your default title"; 
    } 
}); 

E usalo nei tuoi modelli come lo hai usato

{{KAZOOM 'example page'}} 

o

{{KAZOOM}} 

per il titolo di default.

EDIT 26 Jully 2015: per il nuovo router di Ferro sarebbe simile:

Router.route('/user', { 
    onAfterAction: function() { 
    document.title = 'page title'; 
    } 
}); 
+0

Grazie, questo funziona per titoli statici. Preferirei comunque impostare il titolo nel modello, come tutto il resto del testo – sba

+1

Cosa intendi per titoli statici? Ho aggiornato la risposta allora. –

+3

Perché non utilizzare il pacchetto: [iron-router-title] (https://atmospherejs.com/ostrio/iron-router-title)? –

10

sto usando iron-router 0.7.1.

E hanno questo in libs/router.js

Router.onAfterAction(function() { 
     document.title = 'My Site - '+this.route.name; 
     } 
); 

che gestisce tutti i miei percorsi, quindi non c'è bisogno di mettere in ogni percorso.

+0

this.route.getName() ora, appare – IGx89

3

Preferisco che l'attributo titolo venga memorizzato direttamente con la definizione del percorso.

Come suggerito da @nullpo su questo tema https://github.com/iron-meteor/iron-router/issues/292#issuecomment-38508234

Router.route('/admin/users', { 
    name: 'admin_users', 
    template: 'admin_users', 
    title: 'User Manager' 
    data: function() { 
     return Meteor.users.find(); 
    }, 
    waitOn: function() { 
     return Meteor.subscribe('users_admin'); 
    } 
}); 

Router.after(function(){ 
    if (this.route.options.title) 
     document.title = this.route.options.title + ' - my cool site'; 
}); 

Spero che questo aiuti.

+0

La migliore risposta per me!È un peccato che il parametro title non venga rivalutato se si utilizza una variabile reattiva al suo interno. Quale sarebbe la migliore soluzione se vuoi questo tipo di funzionalità? – Wonko

Problemi correlati