Ok, resuelto :) El enrutador de IU angular tiene este nuevo método, $ urlRouterProvider.deferIntercept ()
https://github.com/angular-ui/ui-router/issues/64
básicamente se reduce a esto:
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();
}]);
Creo que este método actualmente solo se incluye en la versión maestra del enrutador angular ui, el que tiene parámetros opcionales (que también son buenos, por cierto). Necesita ser clonado y construido desde la fuente con
grunt build
Los documentos también son accesibles desde la fuente, a través de
grunt ngdocs
(se integran en el directorio / sitio) // más información en README.MD
Parece que hay otra forma de hacerlo, mediante parámetros dinámicos (que no he usado). Muchos créditos a nateabele.
Como nota al margen, aquí hay parámetros opcionales en $ stateProvider del enrutador de IU angular, que utilicé en combinación con lo anterior:
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'
});
}]);
lo que hace es que permite resolver un estado, incluso si falta uno de los parámetros. SEO es un propósito, legibilidad otro.
En el ejemplo anterior, quería que doorsSingle fuera un parámetro obligatorio. No está claro cómo definirlos. Sin embargo, funciona bien con múltiples parámetros opcionales, por lo que no es realmente un problema. La discusión está aquí https://github.com/angular-ui/ui-router/pull/1032#issuecomment-49196090