2014-04-08 20 views
17

Possiedo un'app angolare che utilizza l'ottimo ui-router.Router angolare UI - Parametri dello stato di accesso nel genitore

La mia configurazione assomiglia:

.config(function ($stateProvider, $urlRouterProvider) { 

    $stateProvider 

    // PROJECT DETAIL 
    .state('project', { 
     url: '/project/:projectId/', 
     resolve: { 
      /* some base api calls */ 
     }, 
     views: { 
      'task-list': { 
       templateUrl: 'partials/task_list.tmpl.html', 
       controller: 'TaskListCtrl', 
       resolve: { 
        tasks: function ($stateParams, ConcernService) { 
         return ConcernService.get('project-tasks/', $stateParams.projectId); 
        }, 
       } 
      }, 
      'concern-instance': { 
       /* some resolved variables */ 
      } 
     } 
    }) 
    .state('project.task', { 
     url: 'task/:taskId/', 
     views: { 
      '[email protected]': { 
       /* some different resolved variables */ 
      }, 
     } 
    }) 

Tutto questo funziona come il burro. Tuttavia nel modello task_list nello stato project.task, desidero poter accedere al parametro taskId in modo da poter evidenziare i collegamenti di navigazione attivi, anche quando l'URL è #/project/123/task/456/ il taskId è vuoto. Capisco che questo è dovuto al fatto che i modelli hanno accesso solo ai parametri dichiarati per quello stato. Quindi, se voglio ottenere lo taskId nello stato project.task, come dovrei farlo? Devo ri-dichiarare lo task-list in porject.task?

Qualsiasi aiuto molto apprezzato.

+1

È un problema fastidioso. È possibile rimuovere l'URL per lo stato padre e dichiarare URL completi per gli stati figlio, se non è necessario il parametro di stato nel controller/modello padre. Se lo fai, allora suppongo che potresti inserire lo stato param nello scope in una variabile a cui i bambini possano accedere. – aet

+1

Stiamo incontrando lo stesso problema che descrivi. Probabilmente lo saprai già, ma in effetti puoi accedere a tutti i tuoi parametri tramite '$ state.params'. Ma, se sei come me, non starà bene con te per ottenere i tuoi parametri in modi diversi attraverso i tuoi controller. La cosa più vicina che ho trovato finora nella [documentazione] (https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service/) descrive il problema opposto di uno stato genitore param non disponibile per lo stato figlio. Lo hai mai capito (tramite '$ stateParams')? – Manny

+0

Lo hai mai capito? Sto anche avendo lo stesso problema. – pankaj

risposta

-1

Come si sta tentando di accedere al taskid? Dovrebbe essere come questo, tratto da ufficiale documentation:

$stateProvider 
    .state('contacts.detail', { 
     url: "/contacts/:contactId", 
     templateUrl: 'contacts.detail.html', 
     controller: function ($stateParams) { 
      // If we got here from a url of /contacts/42 
      expect($stateParams).toBe({contactId: 42}); 
     } 
    }) 
14

Nella documentazione UI-Router here Spiegano che

"l'oggetto $ stateParams conterrà solo il params che erano registrata con tale stato."

È possibile accedere ai parametri dello stato padre solo in uno stato secondario utilizzando la proprietà di risoluzione sul genitore.

messo sul vostro stato di 'progetto' (padre):

...  
resolve: { 
    // Expose projectId parameter to child states 
    projectId: ['$stateParams', function ($stateParams) { 
     return $stateParams.projectId; 
    }] 
}, 

poi dentro il controller per il tuo stato 'project.task' (figlio) si dovrebbe avere accesso sia

$stateParams.projectId 

e

$stateParams.taskId 
+0

@DarwinTech se funziona, contrassegnare come risposta. Thx – goodies4uall

4

ho notato $state.params contiene i parametri dello stato figlio. Non riesco a trovare alcuna documentazione su di esso. Funziona solo

+0

Hai ragione! La mia vita è stata salvata! :) Grazie! – Nat

Problemi correlati