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