Estou migrando meu aplicativo baseado em AngularJS para usar o ui-router em vez do roteamento integrado. Eu tenho configurado como mostrado abaixo
.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' }
})
});
Como posso usar a variável pageTitle para definir dinamicamente o título da página? Usando o roteamento integrado, eu poderia fazer
$rootScope.$on("$routeChangeSuccess", function(currentRoute, previousRoute){
$rootScope.pageTitle = $route.current.data.pageTitle;
});
e vincule a variável em HTML conforme mostrado abaixo
<title ng-bind="$root.pageTitle"></title>
Existe um evento semelhante que posso conectar usando o ui-router? Percebi que há funções 'onEnter' e 'onExit', mas elas parecem estar vinculadas a cada estado e exigirão que eu repita o código para definir a variável $ rootScope para cada estado.
Respostas:
Use
$stateChangeSuccess
.Você pode colocá-lo em uma diretiva:
E:
Demo: http://run.plnkr.co/8tqvzlCw62Tl7t4j/#/home
Código: http://plnkr.co/edit/XO6RyBPURQFPodoFdYgX?p=preview
Mesmo com
$stateChangeSuccess
o$timeout
foi necessário para que o histórico estivesse correto, pelo menos quando eu me testei.Edit: 24 de novembro de 2014 - Abordagem declarativa:
E:
Demo: http://run.plnkr.co/d4s3qBikieq8egX7/#/credits
Código: http://plnkr.co/edit/NpzQsxYGofswWQUBGthR?p=preview
fonte
element.text(title)
chamada em $ timeout funcionou para mim. Editando a postagem original.resolve
para gerá-la, em seguida, acessar o valor "resolvidos" durante o evento stateChangeSuccess $ com:$state.$current.locals.resolve.$$values.NAME_OF_RESOLVE_FUNCTION
.Existe uma outra maneira de fazer isso combinando a maioria das respostas aqui já. Sei que isso já foi respondido, mas gostaria de mostrar como altero dinamicamente os títulos das páginas com o ui-router.
Se você der uma olhada no aplicativo de exemplo ui-router , eles usam o bloco angular .run para adicionar a variável $ state a $ rootScope.
Com isso definido, você pode facilmente atualizar dinamicamente o título da página com o que postou, mas modificou para usar o estado definido:
Configure o estado da mesma maneira:
Mas edite o html um pouco ...
Não posso dizer que isso seja melhor do que as respostas anteriores ... mas foi mais fácil para mim entender e implementar. Espero que isso ajude alguém!
fonte
$state
e$stateParams
a$rootScope
partir de dentrorun
.O plugin angular-ui-router-title facilita a atualização do título da página para um valor estático ou dinâmico baseado no estado atual. Também funciona corretamente com o histórico do navegador.
fonte
$stateChangeSuccess
agora está obsoleto no UI-Router 1.xe desativado por padrão. Agora você precisará usar o novo$transition
serviço.Uma solução não é muito difícil, uma vez que você entenda como
$transition
funciona. Recebi ajuda de @troig para entender tudo. Aqui está o que eu criei para atualizar o título.Coloque isso em seu aplicativo Angular 1.6. Observe que estou usando a sintaxe ECMAScript 6; se não estiver, você precisará, por exemplo, mudar
let
paravar
.Em seguida, basta adicionar uma
title
string ao seu estado:Isso fará com que as palavras "Foo Page" apareçam no título. (Se um estado não tiver título, o título da página não será atualizado. Seria uma coisa simples atualizar o código acima para fornecer um título padrão se um estado não o indicar.)
O código também permite que você use uma função para
title
. Othis
usado para chamar a função será o próprio estado, e o único argumento serão os parâmetros de estado, como este exemplo:Para o caminho do URL
/bar/code/123
que mostraria "Código de barras 123" como título da página. Observe que estou usando a sintaxe ECMAScript 6 para formatar a string e extrairparams.code
.Seria bom se alguém com tempo colocasse algo assim em uma diretiva e publicasse para que todos usassem.
fonte
data
objeto para chaves personalizadas.title
não existe naStateDeclaration
interface.Anexando $ state a $ rootscope para usar em qualquer lugar no aplicativo.
fonte
Achei essa maneira muito fácil:
e então no meu HTML assim:
fonte
Basta atualizar window.document.title:
Dessa forma, 'ng-app' não precisa se mover para cima na tag HTML e pode permanecer no corpo ou abaixo.
fonte
Estou usando o ngMeta , que funciona bem não apenas para definir o título da página, mas também as descrições. Ele permite que você defina um título / descrição específico para cada estado, padrões para quando um título / descrição não for especificado, bem como sufixos de título padrão (isto é, '| MySiteName') e valor do autor.
fonte
Você está realmente muito perto de sua primeira resposta / pergunta. Adicione seu título como um objeto de dados:
Em seu index.html vincule os dados diretamente ao título da página:
fonte
Eu terminei com esta combinação das respostas de Martin e tasseKATT - simples e sem qualquer coisa relacionada a template:
fonte
Por que não apenas:
ATUALIZAÇÃO: Código de diretriz completo
Então, em cada página, você apenas incluiria esta diretiva:
fonte
Se você estiver usando ES6, isso funciona muito bem :).
fonte
Talvez você possa tentar esta diretiva.
https://github.com/afeiship/angular-dynamic-title
Aqui está o exemplo:
html:
javascript:
fonte
Para versões atualizadas do UI-Router 1.0.0+, ( https://ui-router.github.io/guide/ng1/migrate-to-1_0 )
Consulte o seguinte código
Adicione o seguinte ao seu index.html:
fonte