Подтвердить что ты не робот

Метеор - настройка названия документа

Есть ли способ изменить элемент <title> в приложении Meteor? Кажется, что шаблоны обрабатываются только в <body>.

4b9b3361

Ответ 1

Довольно много в вашем клиентском JavaScript-коде:

document.title = "My new title";

Ответ 2

Вы можете расширить решение David Wihl:

Deps.autorun(function(){
  document.title = Session.get("DocumentTitle");
});

Затем вы можете в любое время позвонить:

Session.set("DocumentTitle","New Document Title");

Ответ 3

Если вы используете iron: router, вы можете добавить пакет manuelschoebel: ms-seo для обработки название вместе с метатегами. Это полезно для статических и динамических данных SEO:

Router.map(function() {
  return this.route('blogPost', {
    path: '/blog/:slug',

    onAfterAction: function() {
      var post = this.data().post;
      SEO.set({
        title: post.title,
        meta: {
          'description': post.description
        },
        og: {
          'title': post.title,
          'description': post.description
        }
      });
    }
  });
});

Ответ 4

Вы можете создать помощник для установки заголовка (CoffeeScript):

UI.registerHelper "setTitle", ->
  title = ""
  for i in [0..arguments.length-2]
    title += arguments[i]
  document.title = title
  undefined

или то же самое в Js:

UI.registerHelper("setTitle", function() {
  var title = "";
  for (var i = 0; i < arguments.length - 1; ++i) {
    title += arguments[i];
  }
  document.title = title;
});

Тогда вы можете использовать его сложными способами, и он будет реактивным:

{{#if book}}
  {{setTitle book.title}}
{{else}}
  {{setTitle "My books"}}
{{/if}}

Ответ 5

Мне удобнее обрабатывать такие вещи прямо в маршрутизаторе с помощью onBeforeAction:

Router.map(function() {
  return this.route('StudioRoot', {
    path: '/',
    onBeforeAction: function() {
      return document.title = "My Awesome Meteor Application";
    }
  });
});

Ответ 6

вы также можете включить теги <head> </head>, которые не находятся в шаблоне. попробуйте следующее:

содержимое sample.html:

<head>
    <title>my title</title>
</head>

<body>
    ...
</body>

<template name="mytemplate">
    ...
</template>

Ответ 7

Что я закончил:

в Meteor.isClient:

Meteor.startup(function() {
    Deps.autorun(function() {
        document.title = Session.get('documentTitle');
    });
});

теперь, когда переменная var настроена реактивно, зайдите в файл маршрутизатора (если это еще не сделано: meteor add iron: router. Мой файл маршрутизатора - это клиент и сервер)

Router.route('/', {
    name: 'nameOfYourTemplate',
    onBeforeAction: function () {
        Session.set('documentTitle', 'whateverTitleIWant');
        this.next();    //Otherwise I would get no template displayed
    }
});

Не имеет значения, если вы уже установили заголовок в теге head. Он будет заменен этим по вашему маршруту.

Ответ 8

Мне пришлось искать ответ, который будет работать для ui-router. Я знаю, что это может быть не тот ответ, который вы искали. Поскольку этот вопрос был опубликован около 2 лет назад, я решил, что если кто-то еще придет сюда искать решение с ui-router, этот ответ может им помочь:

myApp.run.js

(function() {
  'use strict';

  angular
    .module('myApp')
    .run(run);

  run.$inject = ['$rootScope', '$state'];

  function run($rootScope, $state) {
    $rootScope.$on("$stateChangeSuccess", function(previousRoute, currentRoute){
      document.title = 'myApp - ' + currentRoute.data.pageTitle;
    });
  };

})();

routes.js

(function() {
    'use strict';

    angular
      .module('myApp')
      .config(config);

    config.$inject = 
      ['$urlRouterProvider', '$stateProvider', '$locationProvider'];

    function config($urlRouterProvider, $stateProvider) {

        // ...
        $stateProvider
          .state('home', {
            url: '/',
            templateUrl: 'client/home/views/home.ng.html',
            controller: 'HomeController',
            data: {
              pageTitle: 'My Dynamic title'
            }
          })
    }
})();