2015-02-19 17 views
8

La mia gerarchia di stati è (dall'alto verso il basso):router UI angolare, come ottenere un elenco di antenati dello stato corrente dal controller?

  1. root
  2. account
  3. account.invoices
  4. account.invoices.detail

Quando sono in account.invoices.detail stato in cui mi piacerebbe ottenere un elenco degli stati degli antenati:

angular 
    .module('app') 
    .controller('InvoiceDetailCtrl', ['$scope', '$state', function ($scope, $state) { 
     var current = $state.current.name; 
     // Get ancestors from current state 
     // Tried $state.current.parent, $state.parent, $state.parent(current) 
    }]); 

Il router UI angolare consente di ottenere la transizione allo stato genitore (ad es. da una vista con data-ui-sref="^"), quindi dovrebbe essere possibile ottenere questo risultato (seguire la catena di antenati fino a root).

Ho bisogno di questo per creare una funzionalità simile a breadcrumb.

EDIT: è conclusa con questo, grazie alla risposta accettata:

var current = $scope.$state.$current, 
    parent = current.parent, 
    ancestors = [current.name]; 

while (typeof parent != 'undefined' && parent.name.length) { 
    ancestors.push(parent.name); 
    parent = parent.parent; 
} 

se si chiede il motivo per cui il controllo per parent.name.length è perché c'è qualcosa di simile a uno stato di "root" in angolare UI (can non avere alcuna documentazione su).

+0

Come hai detto, puoi farlo interrogando i genitori o i genitori e compilando la lista da solo. AFAIK non esiste un metodo che restituisca un elenco di antenati per uno stato particolare. – Wawy

+0

@Wawy come faccio a interrogare il genitore dello stato attuale? Dall'interno del controller intendo ... – gremo

risposta

11

Dai un'occhiata alla $state.$current.includes; sembra restituire un oggetto con chiavi che corrispondono agli stati corrente e genitore. Credo che questi siano tutti stati che supererebbero un test $state.includes().

+2

Quello che stavo cercando, grazie mille! Ho usato '.parent' invece di' .includes'. – gremo

+0

Sembra che tu abbia ragione :). – Wawy

1

nel controller:

function getParentList(state) { 
var parentList = []; 
var state = state.parent; 
while(state) { 
    parentList.push(state.toString()); 
    state = state.parent; 
} 
return parentList; 
} 

var parents = getParentList($state.$current); 
+1

Sì, ma 'state.parent' è' indefinito' quando si utilizza la notazione 'parent.child' (notazione dot). – gremo

Problemi correlati