Tamam, çözüldü :) Angular UI Router bu yeni yönteme sahip, $ urlRouterProvider.deferIntercept ()
https://github.com/angular-ui/ui-router/issues/64
temelde şuna geliyor:
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();
}]);
Sanırım bu yöntem şu anda yalnızca açısal ui yönlendiricinin ana sürümüne dahil edildi, isteğe bağlı parametrelere sahip olan (ki bunlar da güzel, btw). Kaynaktan klonlanması ve oluşturulması gerekir.
grunt build
Dokümanlara kaynaktan da erişilebilir.
grunt ngdocs
(/ site dizinine yerleştirilirler) // README.MD'de daha fazla bilgi
Bunu yapmanın dinamik parametrelerle (kullanmadığım) başka bir yolu var gibi görünüyor . Nateabele'ye birçok kredi.
Bir yan not olarak, Angular UI Router'ın $ stateProvider'ında yukarıdakilerle kombinasyon halinde kullandığım isteğe bağlı parametreler :
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'
});
}]);
bunun yaptığı şey, parametrelerden biri eksik olsa bile bir durumu çözmeye izin vermektir. SEO bir amaç, okunabilirlik başka bir amaçtır.
Yukarıdaki örnekte, doorsSingle'ın gerekli bir parametre olmasını istedim. Bunların nasıl tanımlanacağı belli değil. Birden fazla isteğe bağlı parametrede sorunsuz çalışır, bu yüzden gerçekten bir sorun değildir. Tartışma burada https://github.com/angular-ui/ui-router/pull/1032#issuecomment-49196090