Магистраль и document.title - программирование
Подтвердить что ты не робот

Магистраль и document.title

Я создаю одностраничное приложение с backbone.js и хотел бы знать, как лучше всего обрабатывать изменение названия. Я думал о наличии опции "title" в представлении и чтобы маршрутизатор (каким-то образом) установил document.title. Кто-нибудь реализовал что-то подобное? Благодаря

4b9b3361

Ответ 1

почему бы не использовать вызываемый характер Backbone.js.

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

Маршрутизатор должен делегировать маршруты, не более того.

то, что я предлагаю, вместо этого (в зависимости от того, как вы инициализируете свое приложение) создаете агрегатор событий на уровне приложений.

var app = new Application();
app.eventAggregator = _.extend({}, Backbone.Events);

и привязать событие к вашему приложению как таковое:

app.eventAggregator.on('domchange:title', this.onDomChangeTitle, this);

где в вашей конструкции приложения

onDomChangeTitle: function (title) 
{
   $(document).attr('title', title);
}

и теперь вместо того, чтобы оставлять его на маршрутизаторе, чтобы всегда захватывать заголовок и убедиться, что в каждом представлении есть метод getTitle, вы можете - внутри вашего представления и, следовательно, ЛЮБОЙ просмотр - вызвать следующее событие, когда вы визуализируете или инициализируете представление:

app.eventAggregator.trigger('domchange:title', this.title);

он делает для более чистого и более компактного кода, на мой взгляд, но опять же, это просто мнение.

Ответ 2

Почему вы все используете jQuery для изменения названия документа вместо чистого Javascript? Быстрее, проще, чище...

document.title = 'new title';

Ответ 3

Я бы предложил просто поместить код в обратные вызовы маршрутизатора. Это будет другая строка кода, но без знания текущего представления маршрутизатор/приложение не будет знать, какой вид имеет правильный заголовок. (На самом деле нет хорошего места для переопределения поведения и предоставления названия документа без замены некоторых встроенных функций в Backbone.JS).

Вы могли бы добавить что-то к своему виду очень просто:

var PeopleView = Backbone.View.extend({
    title: 'People are People',
    //
    //or 
    //
    getTitle: function () {
        return "Something Dynamic";
    }
});

И затем в вашем обратном вызове маршрутизатора:

var v = new PeopleView();
$(document).attr('title', v.getTitle());

Еще один вариант заключается в том, чтобы просто установить View, когда он был создан или когда вызывается специальный метод. Но, я бы использовал первый вариант.

Ответ 4

Вот что я делаю в этом проекте:

var App = {};

App.HomeView = Backbone.View.extend({
  documentTitle: 'my site title'
})
var Router = Backbone.Router.extend({
  routes: {
      '':    'home'
    , 'home': 'home'

, baseTitle: ' - my site'

, home: function(actions) {
    var obj = this;
    obj._changePage('HomeView');
  }

, changeTitle: function(title, withoutBaseTitle) {
    var obj = this;

    if(withoutBaseTitle !== true)
      title += obj.baseTitle;

    document.title = title;
    return obj;
  }

, _changePage: function(viewName, viewOptions) {
    var obj = this;
    var page = App[viewName]();

    if(typeof page.documentTitle !== 'undefined') {
      obj.changeTitle(page.documentTitle);
    }
  }

})

Ответ 5

Своего очень старого поста, но я дам ему еще одну реинкарнацию.


С текущим Marionette v3.2.0 вы можете сделать следующее:

// Get title from view where we manage our layout/views
var viewTitle = view.triggerMethod('page:title');

По вашему мнению, вы создаете этот магический метод следующим образом:

Mn.View.extend({
    onPageTitle() {
        return ['User', this.model.get('id')].join(' | ');
    }
});

И само название может быть следующим:

document.title = !!viewTitle
        ? (
            _.isArray(viewTitle)
                ? [baseTitle].concat(viewTitle)
                : [baseTitle, viewTitle]
          ).join(' / ')
        : baseTitle ;

Позволяет разрешать титры, возвращенные как массивы, и выводится с помощью одного разделителя

  • Он может быть легко интегрирован в рабочий процесс приложения, где вы можете управлять своими контентом.
  • onPageTitle будет вызываться в контексте представления (this будет экземпляром представления внутри функции), что дает возможность вызывать данные модели и любые связанные с просмотром вещи.
  • Не нужно беспокоиться о доступности метода проверки, просто звоните и идите.
  • Кроме того, вы всегда можете отступить к заголовку по умолчанию, если такой метод не определен как triggerMethod будет возвращать undefined в таких случаях.
  • Profit!