Я переношу свое приложение на основе AngularJS на использование ui-router вместо встроенной маршрутизации. Я настроил его, как показано ниже
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('home', {
url: '/home',
templateUrl : 'views/home.html',
data : { pageTitle: 'Home' }
})
.state('about', {
url: '/about',
templateUrl : 'views/about.html',
data : { pageTitle: 'About' }
})
});
Как я могу использовать переменную pageTitle для динамической установки заголовка страницы? Используя встроенную маршрутизацию, я мог
$rootScope.$on("$routeChangeSuccess", function(currentRoute, previousRoute){
$rootScope.pageTitle = $route.current.data.pageTitle;
});
а затем привяжите переменную в HTML, как показано ниже
<title ng-bind="$root.pageTitle"></title>
Есть ли подобное событие, к которому я могу подключиться с помощью ui-router? Я заметил, что есть функции onEnter и onExit, но они, кажется, привязаны к каждому состоянию и потребуют от меня повторения кода для установки переменной $ rootScope для каждого состояния.
Ответы:
Используйте
$stateChangeSuccess
.Вы можете поместить это в директиву:
И:
Демо: http://run.plnkr.co/8tqvzlCw62Tl7t4j/#/home
Код: http://plnkr.co/edit/XO6RyBPURQFPodoFdYgX?p=preview
Даже с
$stateChangeSuccess
тем$timeout
, чтобы история была правильной, по крайней мере, когда я проверял себя.Изменить: 24 ноября 2014 г. - Декларативный подход:
И:
Демо: http://run.plnkr.co/d4s3qBikieq8egX7/#/credits
Код: http://plnkr.co/edit/NpzQsxYGofswWQUBGthR?p=preview
источник
element.text(title)
меня сработало включение вызова в тайм-аут $. Редактирование исходного сообщения.resolve
для его генерации, а затем получить доступ к «разрешенному» значению в течение $ stateChangeSuccess события с:$state.$current.locals.resolve.$$values.NAME_OF_RESOLVE_FUNCTION
.Есть другой способ сделать это, уже здесь объединив большинство ответов. Я знаю, что на это уже дан ответ, но я хотел показать, как я динамически меняю заголовки страниц с помощью ui-router.
Если вы посмотрите на пример приложения ui-router , они используют блок angular .run для добавления переменной $ state в $ rootScope.
После этого вы можете легко динамически обновлять заголовок своей страницы тем, что вы опубликовали, но изменили, чтобы использовать определенное состояние:
Таким же образом настройте состояние:
Но немного отредактируйте html ...
Я не могу сказать, что это лучше, чем ответы ранее ... но мне было легче понять и реализовать. Надеюсь, это кому-то поможет!
источник
$state
и$stateParams
включение$rootScope
изнутриrun
.Угловой-UI-маршрутизатор титульный плагин позволяет легко обновить заголовок страницы к статическому или динамическому значению , основанное на текущем состоянии. Он также корректно работает с историей браузера.
источник
$stateChangeSuccess
теперь устарела в UI-Router 1.x и отключена по умолчанию. Теперь вам нужно будет использовать новую$transition
службу.Решение не так уж и сложно, если вы понимаете, как
$transition
работает. Я получил некоторую помощь от @troig, чтобы разобраться во всем этом. Вот что я придумал для обновления названия.Поместите это в свое приложение Angular 1.6. Обратите внимание, что я использую синтаксис ECMAScript 6; если нет, вам нужно, например, перейти
let
наvar
.Затем просто добавьте
title
строку в свое состояние:В заголовке появятся слова «Foo Page». (Если состояние не имеет заголовка, заголовок страницы не будет обновлен. Было бы просто обновить приведенный выше код, чтобы предоставить заголовок по умолчанию, если состояние не указывает его.)
Код также позволяет использовать функцию для
title
.this
Используется для вызова функции будет само состояние, а один из аргументов будут параметры состояния, как в этом примере:Для пути URL,
/bar/code/123
который будет отображать «Штрих-код 123» в качестве заголовка страницы. Обратите внимание, что я использую синтаксис ECMAScript 6 для форматирования строки и извлеченияparams.code
.Было бы неплохо, если бы кто-нибудь, у кого было время, поместил бы что-то подобное в директиву и опубликовал бы для всех.
источник
data
объект для пользовательских ключей.title
не существует вStateDeclaration
интерфейсе.Присоединение $ state к $ rootcope для использования в любом месте приложения.
источник
Я нашел этот способ очень простым:
а затем в моем HTML вот так:
источник
Просто обновите window.document.title:
Таким образом, ng-app не нужно перемещаться вверх к тегу HTML и может оставаться на теле или ниже.
источник
Я использую ngMeta , который хорошо работает не только для настройки заголовка страницы, но и для описания. Он позволяет вам установить конкретный заголовок / описание для каждого состояния, значения по умолчанию, когда заголовок / описание не указано, а также суффиксы заголовка по умолчанию (например, '| MySiteName') и значение автора.
источник
Вы действительно очень близки со своим первым ответом / вопросом. Добавьте свой заголовок как объект данных:
В вашем index.html привяжите данные непосредственно к заголовку страницы:
источник
В итоге я получил эту комбинацию ответов Мартина и tasseKATT - просто и без каких-либо вещей, связанных с шаблоном:
источник
Почему не просто:
ОБНОВЛЕНИЕ: Полный код директивы
Затем на каждой странице вы просто включите эту директиву:
источник
Если вы используете ES6, это прекрасно работает :).
источник
Может быть, вы можете попробовать эту директиву.
https://github.com/afeiship/angular-dynamic-title
Вот пример:
html:
javascript:
источник
Для обновленных версий UI-Router 1.0.0+ ( https://ui-router.github.io/guide/ng1/migrate-to-1_0 )
См. Следующий код
Добавьте в свой index.html следующее:
источник