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:
angular.module('myApp', [ui.router])
.config(['$urlRouterProvider', function ($urlRouterProvider) {
$urlRouterProvider.deferIntercept();
}])
// then define the interception
.run(['$rootScope', '$urlRouter', '$location', '$state', function ($rootScope, $urlRouter, $location, $state) {
$rootScope.$on('$locationChangeSuccess', function(e, newUrl, oldUrl) {
// Prevent $urlRouter's default handler from firing
e.preventDefault();
/**
* provide conditions on when to
* sync change in $location.path() with state reload.
* I use $location and $state as examples, but
* You can do any logic
* before syncing OR stop syncing all together.
*/
if ($state.current.name !== 'main.exampleState' || newUrl === 'http://some.url' || oldUrl !=='https://another.url') {
// your stuff
$urlRouter.sync();
} else {
// don't sync
}
});
// Configures $urlRouter's listener *after* your custom listener
$urlRouter.listen();
}]);
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
grunt build
Os documentos também podem ser acessados da fonte, por meio de
grunt ngdocs
(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:
angular.module('myApp').config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('main.doorsList', {
url: 'doors',
controller: DoorsListCtrl,
resolve: DoorsListCtrl.resolve,
templateUrl: '/modules/doors/doors-list.html'
})
.state('main.doorsSingle', {
url: 'doors/:doorsSingle/:doorsDetail',
params: {
// as of today, it was unclear how to define a required parameter (more below)
doorsSingle: {value: null},
doorsDetail: {value: null}
},
controller: DoorsSingleCtrl,
resolve: DoorsSingleCtrl.resolve,
templateUrl: '/modules/doors/doors-single.html'
});
}]);
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