Добре, вирішено :) У кутовому маршрутизаторі інтерфейсу є цей новий метод, $ urlRouterProvider.deferIntercept ()
https://github.com/angular-ui/ui-router/isissue/64
в основному зводиться до цього:
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();
}]);
Я думаю, що цей метод наразі включений лише у головну версію кутового маршрутизатора, що має необов’язкові параметри (які також приємні, btw). Його потрібно клонувати та будувати з джерела
grunt build
Документи доступні і з джерела, через
grunt ngdocs
(вони вбудовуються в каталог / site) // додаткова інформація в README.MD
Здається, є інший спосіб зробити це за допомогою динамічних параметрів (які я ще не використовував). Багато кредитів натеабеле.
В якості додаткового означення ось необов'язкові параметри у $ stateProvider маршрутизатора інтерфейсу UI, які я використовував у поєднанні з вищезазначеним:
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'
});
}]);
що це робить, це дозволяє вирішити стан, навіть якщо одного з парам не вистачає. SEO - одна мета, читабельність - інша.
У наведеному вище прикладі я хотів, щоб doorSingle був необхідним параметром. Незрозуміло, як їх визначити. Це працює добре з декількома необов'язковими параметрами, тому насправді це не проблема. Дискусія тут https://github.com/angular-ui/ui-router/pull/1032#issuecomment-49196090