Oke, terpecahkan :) Router UI Sudut memiliki metode baru ini, $ urlRouterProvider.deferIntercept ()
https://github.com/angular-ui/ui-router/issues/64
pada dasarnya turun ke ini:
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();
}]);
Saya pikir metode ini saat ini hanya termasuk dalam versi master dari router ui sudut, yang dengan parameter opsional (yang bagus juga, btw). Itu perlu dikloning dan dibangun dari sumber dengan
grunt build
Dokumen juga dapat diakses dari sumbernya, melalui
grunt ngdocs
(mereka dibangun ke direktori / situs) // info lebih lanjut di README.MD
Tampaknya ada cara lain untuk melakukan ini, dengan parameter dinamis (yang saya belum pernah gunakan). Banyak kredit untuk nateabele.
Sebagai sidenote, berikut adalah parameter opsional di $ stateProvider Angular UI Router, yang saya gunakan dalam kombinasi dengan yang di atas:
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'
});
}]);
apa yang dilakukan adalah memungkinkan untuk menyelesaikan suatu keadaan, bahkan jika salah satu params hilang. SEO adalah satu tujuan, keterbacaan yang lain.
Dalam contoh di atas, saya ingin doorsSingle menjadi parameter yang diperlukan. Tidak jelas bagaimana mendefinisikannya. Ini berfungsi ok dengan beberapa parameter opsional, jadi tidak terlalu masalah. Diskusi ada di sini https://github.com/angular-ui/ui-router/pull/1032#issuecomment-49196090