Atualmente, nosso projeto está usando o padrão $routeProvider
, e eu estou usando esse "hack", para mudar url
sem recarregar a página:
services.service('$locationEx', ['$location', '$route', '$rootScope', function($location, $route, $rootScope) {
$location.skipReload = function () {
var lastRoute = $route.current;
var un = $rootScope.$on('$locationChangeSuccess', function () {
$route.current = lastRoute;
un();
});
return $location;
};
return $location;
}]);
e em controller
$locationEx.skipReload().path("/category/" + $scope.model.id).replace();
Estou pensando em substituir routeProvider
com ui-router
para rotas de nidificação, mas não consigo encontrar isso em ui-router
.
É possível - faça o mesmo com angular-ui-router
?
Por que eu preciso disso? Deixe-me explicar com um exemplo:
Rota para criar nova categoria é /category/new
depois clicking
em SALVAR eu mostro success-alert
e quero mudar de rota /category/new
para /caterogy/23
(23 - é id do novo item armazenado em db)
angularjs
angular-ui-router
vuliad
fonte
fonte
$urlRouterProvider.otherwise
parece operar em um URL, não em um estado. Hmmm, talvez eu possa viver com 2 URLs ou encontrar outra maneira de indicar que é um URL inválido.Respostas:
Simplesmente você pode usar em
$state.transitionTo
vez de$state.go
.$state.go
chamadas$state.transitionTo
internamente, mas define automaticamente as opções para{ location: true, inherit: true, relative: $state.$current, notify: true }
. Você pode ligar$state.transitionTo
e definirnotify: false
. Por exemplo:pode ser substituído por
Edit: Como sugerido por fracz, pode ser simplesmente:
fonte
$state.transitionTo('.detail', {id: newId}, { location: true, inherit: true, relative: $state.$current, notify: false })
Então, basicamente definir notificar à falsa e localização para true$state.go('.detail', {id: newId}, {notify: false})
.Ok, resolvido :) O Angular UI Router possui este novo método, $ urlRouterProvider.deferIntercept () https://github.com/angular-ui/ui-router/issues/64
basicamente, tudo se resume a isso:
Eu acho que esse método atualmente está incluído apenas na versão principal do roteador angular da interface do usuário, aquele com parâmetros opcionais (que também são bons, btw). Ele precisa ser clonado e construído a partir da fonte com
Os documentos também podem ser acessados da fonte, por meio de
(eles são criados no diretório / site) // mais informações em README.MD
Parece haver outra maneira de fazer isso, por parâmetros dinâmicos (que eu não usei). Muitos créditos para nateabele.
Como nota de rodapé , aqui estão os parâmetros opcionais no $ stateProvider do Angular UI Router, que eu usei em combinação com o acima:
o que isso faz é permitir resolver um estado, mesmo que um dos parâmetros esteja ausente. SEO é um objetivo, legibilidade outro.
No exemplo acima, eu queria que doorsSingle fosse um parâmetro obrigatório. Não está claro como defini-los. Ele funciona bem com vários parâmetros opcionais, portanto, não é realmente um problema. A discussão está aqui https://github.com/angular-ui/ui-router/pull/1032#issuecomment-49196090
fonte
Error: Both params and url specicified in state 'state'
. Diz nos documentos que também é uso inválido. Um pouco decepcionante.Depois de passar muito tempo com esse problema, aqui está o que eu comecei a trabalhar
fonte
ui-router
somente, como você pode dizer isso, outras soluções estavam trabalhando para$routerProvider
,$routeProvider
e$stateProvider
são totalmente diferentes na arquitetura ..$onInit()
é chamado no meu componente toda vez que eu uso o$state.go
. Não parece 100% ok para mim.Chamando
ainda recarregará o controlador.
Para evitá-lo, você deve declarar o parâmetro como dinâmico:
Então você nem precisa do
notify
, apenas ligandoé suficiente. Neato!
A partir da documentação :
fonte
Esta configuração resolveu os seguintes problemas para mim:
.../
para.../123
Configuração do estado
Chamando os estados (de qualquer outro controlador)
Controlador de treinamento
fonte
Se você precisar alterar apenas o URL, mas evitar o estado de alteração:
Altere o local com (adicione .replace se você deseja substituir no histórico):
Impedir o redirecionamento para o seu estado:
fonte
Eu fiz isso, mas há muito tempo na versão: v0.2.10 do roteador da interface do usuário como algo assim:
fonte
Tente algo como isto
fonte
Eu não acho que você precise de ui-router para isso. A documentação disponível para o serviço $ location diz no primeiro parágrafo: "... as alterações em $ location são refletidas na barra de endereços do navegador". Mais tarde, ele continua dizendo: "O que não faz? Não causa o recarregamento de uma página inteira quando o URL do navegador é alterado".
Portanto, com isso em mente, por que não simplesmente alterar o $ location.path (como o método é um getter e um setter) com algo como o seguinte:
A documentação observa que o caminho deve sempre começar com uma barra, mas isso será adicionado se estiver faltando.
fonte
ui-router
e uso$location.path(URL_PATH)
, a página é renderizada automaticamente ?!