2015-02-19 11 views
8

Moje stany hierarchia (od góry do dołu):Angularny router UI, jak uzyskać listę przodków bieżącego stanu z kontrolera?

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

Kiedy jestem w stanie account.invoices.detail Chciałbym uzyskaj listę stanów przodków:

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) 
    }]); 

Angularny router UI pozwala uzyskać przejście do stanu macierzystego (tj. z widoku z data-ui-sref="^"), więc powinno być możliwe osiągnięcie tego (śledzenie łańcucha przodków do root).

Potrzebuję tego do zbudowania funkcjonalności podobnej do automatycznej bułki.

EDIT: skończyło się tym, że dzięki przyjętym odpowiedź:

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; 
} 

Jeśli zapytasz dlaczego czek na parent.name.length jego ponieważ istnieje coś takiego jak „root” stanie w Kątowymi UI (CAN nie dostaniesz żadnej dokumentacji).

+0

Tak jak powiedziałeś, możesz to zrobić, przesłuchując rodziców lub rodziców i samemu budując listę. AFAIK nie ma metody, która zwraca listę przodków dla określonego stanu. – Wawy

+0

@Wawy Jak mogę zapytać rodzica o aktualny stan? Od wewnątrz kontrolera mam na myśli ... – gremo

Odpowiedz

11

spojrzeć $state.$current.includes; wydaje się, że zwraca obiekt z kluczami pasującymi do stanów bieżących i macierzystych. Sądzę, że są to wszystkie stany, które przeszłyby test $state.includes().

+2

Czego szukałem, wielkie dzięki! Użyłem '.parent' zamiast' .includes'. – gremo

+0

Wydaje się, że masz rację :). – Wawy

1

W kontrolerze:

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

Tak, ale 'stan.parent' jest' niezdefiniowany' kiedy używasz notacji 'parent.child' (notacja kropkowa). – gremo