2013-10-02 12 views
10

Mam pagination wewnątrz dialog obie dyrektywy są z ui.bootstrap. Problem polega na tym, że $watch nie działa dla elementu CurrentPage.Angular ui.bootstrap paginacja - bieżąca strona nie aktualizuje się/oglądaj nie działa

Teraz podobny kod działa idealnie dobrze dla innych stron, w których w niektórych oknach dialogowych nie ma paginacji.

Przypuszczam ten problem jest związany z $scope ale potem currentPage jest dostępny w zakresie i mogę wyświetlić go na szablonie przy użyciu {{currentPage}}

Proszę znaleźć kod w plunker

$scope.$watch('currentPage') nie jest opalanych klikając na linki strony.

Teraz, w celu obejścia problemu, można użyć wywołania zwrotnego on-select-page dostarczonego przez dyrektywę paginacji.

np.

<pagination on-select-page="pageChanged(page)" total-items="totalItems" items-per-page = "numPerPage" page="currentPage" max-size="maxSize"></pagination> 

i wewnątrz mojego kontrolera mogę mieć,

$scope.pageChanged = function(page) { 
    console.log(page);  
}; 

Ale raczej trzeba zrozumieć, dlaczego w takich przypadkach $scope.$watch przyzwyczajenie praca.

Aktualizacja: Z konsoli Poniżej znajduje się wartość Obserwowane

$$watchers: Array[1] 
0th: Object 
    eq: false 
    exp: "currentPage" 
    fn: function (o,n){} 

Odpowiedz

28

Zastosowanie:

... page="$parent.currentPage" ... 

Albo właściwe rozwiązanie:

Kiedy zagnieżdżone zakresy są zaangażowane powiązać Vars poziom głębszy tj .:

$scope.data.currentPage = ... 

szczegóły here

przykład here

+2

Przede wszystkim, doceniam twój wysiłek za odpowiedź. Dzięki. Chociaż to działa. Mam pytanie - jeśli zakres jest nieprawidłowy, w jaki sposób mogę wyświetlić aktualną stronę na szablonie za pomocą '{{currentPage}}'.Przez pytanie chcę uzyskać lepsze zrozumienie zakresu $. dla rozwiązania mógłbym użyć atrybutu 'on-select-page'. –

+0

Przebaczam mi za działającą, ale złą odpowiedź, jest to moja 17-ta godzina do tej pory i zazwyczaj mam skłonność do błędów tak późno. Zakres jest poprawny, ale gdy jest zagnieżdżony, wiąż go z poziomem głębszym, tj. $ Scope.data.currentPage i będzie działał dobrze, zobacz https://github.com/angular/angular.js/wiki/Understanding-Scopes także patrz przykład roboczy: http://plnkr.co/edit/2zY91RofKrmUf2zpMuPf?p=preview – Max

+0

"to moja 17-ga godzina" >> nie ma problemu :) _ "Kiedy w grę wchodzą zagnieżdżone zakresy, wiąż swoje vary o poziom głębszy" _ >> robi sens. dzięki za oczyszczenie. –

1

Ponieważ podczas tworzenia nowego kontrolera (ModalDialogBaseCtl) wewnątrz sterownika TestCtrl, kątowe stworzy nowy zakres, który dziedziczy wszystkie właściwości z jego rodzica.

Linia, która wydaje mi się podejrzana, to miejsce, w którym przypisujesz wartość do $ scope.currentPage na początku ModalDialogBaseCtrl. Angular interpretuje to jako deklarującą nową zmienną o nazwie currentPage w nowym zakresie. Jednak twoja kontrola paginacji jest dołączona do zmiennej currentPage w MainCtrl, więc oglądanie ModalDialogBaseCtl nie robi nic (nigdy nie zmienia wartości).

Jedną z poprawek jest użycie $ parent, jak sugeruje Max, ale to nie jest świetna struktura. Zamiast tego spróbuj znaleźć sposób, aby mieć tylko jedną właściwość currentPage zamiast dwóch.

+0

Dzięki za odpowiedź w pierwszej kolejności. _ "tworzenie nowego kontrolera ... stworzy nowy zakres" _> Jestem tego świadomy. _ "Przypisuję wartość do $ scope.currentPage na początku Ctrl" _ >> nawet bez tego wyniku jest taka sama. _ "spróbuj znaleźć sposób, aby mieć tylko jedną właściwość currentPage zamiast dwóch." _ >> cóż, nie mogę tutaj znaleźć rozwiązania, * mam listę główną wyświetlaną przy użyciu 'TestCtrl', która używa' currentPage', więc nie mogę tego usunąć to stamtąd *. Być może możesz zasugerować coś tutaj. Zgadzam się, że nie jest to świetna struktura, jeśli muszę użyć '$ parent', aby uzyskać dostęp do dowolnego obiektu $ scope –

Powiązane problemy