mi ha risolto il problema. Ho anche postato su questo su angular-ui github, e la loro risposta è stata fondamentalmente, "beh, quel caso non è in realtà ciò per cui è stato progettato il router, quindi se si desidera una gestione dello stato" appassionata ", inserire i dati nei parametri e guardali tu stesso e implementa qualsiasi logica tu abbia bisogno ". Ho pensato che fosse per questo che era stato progettato l'ui-router, quindi l'ho esteso un po '(senza modifiche al codice sorgente) per ottenere questo risultato. La soluzione è una combinazione di stati astratti, uno stato falso "off", parametri negli URL del router ed estensione del servizio $ urlRouterProvider.
Prima estendere il $ urlRouterProvider:
urlRouterProvider.when(/^((?!leftpanel).)*$/, ['$state', '$location', function ($state, $location) {
//we've got just /app or /app/3434, nothing that contains /leftpanel, so turn off
$state.transitionTo("off");
}]);
Quindi aggiungere che lo stato "off":
$stateProvider.state('off',{
//url: //there is no url
views:{
container:{
template: 'blank',
controller:['$scope', '$stateParams', function($scope, $stateParams){
console.log("off yay"); //just for sanity, not necessary
}]
}
}});
Poi impostare il resto della app di routing:
appModule.constant('LEFT_PANEL_STATES', function() {
var leftPanelRoot = {
name: 'root.leftpanel', //mandatory
template: '',
url: "/app/:primaryId/leftpanel",
views:{
'[email protected]': {
templateUrl: "partials/leftpanel_container_partial.html",
controller:"LeftPanelRootCtrl",
resolve: {
//etc
}
}
},
"abstract":true //makes this view only viewable from one of its child states
};
var leftPanelItemsList = {
name: 'root.leftpanel.itemslist', //mandatory
parent: leftPanelRoot, //mandatory
url: "/items-list",
views:{
'[email protected]': {
templateUrl: "partials/leftpanel_items_list.html",
controller:"LeftPanelItemsListCtrl",
resolve: {
//etc
}
}
}};
var leftPanelListDetail = {
name:"root.leftpanel.itemslist.detail",
parent:leftPanelItemsList,
url:"/:id/detail",
views:{
"detail":{
templateUrl:"partials/leftpanel_item_detail.html",
controller:"LeftPanelItemListDetailCtrl"
}
}};
var leftPanelExtendedDetailList = {
name:"root.leftpanel.itemslist.extendedlist",
parent:leftPanelItemsList,
url:"/:id/extendedDetail/list",
views:{
"extendeddetaillist":{
templateUrl:"partials/leftpanel_extended_detail_list.html",
controller:"LeftPanelExtendedDetailListCtrl"
}
}};
Avete calcolato qualcosa fuori? Voglio davvero sapere come farlo. Ho aggiunto un problema qui, https://github.com/angular-ui/ui-router/issues/306 –
La mia teoria è, se si fosse in grado di avere ui-state indipendente dall'ambito di root, si potrebbe avere un controllo granulare all'interno di un modulo. Tuttavia, sembra essere direttamente accoppiato con $ rootScope ... –
Hai mai risolto questo problema? –