2013-10-02 16 views
10

Ho un pagination all'interno di unentrambe le direttive sono di ui.bootstrap. Il problema è che $watch non funziona per membro currentPage.Angolazione ui.bootstrap angolare - pagina corrente non aggiornata/orologio non funzionante

Ora, il codice simile funziona perfettamente per le altre pagine in cui l'impaginazione non si trova all'interno di una finestra di dialogo.

Suppongo che questo problema è legato alla $scope ma poi currentPage è disponibile nel campo di applicazione e posso visualizzarlo sul modello utilizzando {{currentPage}}

Si prega di trovare il codice nella plunker

$scope.$watch('currentPage') non sparare su collegamenti di pagina di scatto.

Ora, per la soluzione alternativa, è possibile utilizzare la richiamata on-select-page fornita dalla direttiva di impaginazione.

ad es.

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

e dentro il mio controller posso avere,

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

Ma ho piuttosto bisogno di capire il motivo per cui in questi casi $scope.$watch abituato lavoro.

Update: Dalla console che segue è il valore osservatori

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

risposta

28

Usa:

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

o una soluzione adeguata:

Quando gli ambiti annidati sono coinvolti vincolare il proprio vars un livello più profondo cioè:

$scope.data.currentPage = ... 

dettagli here

esempio here

+2

Prima di tutto, apprezzo il tuo impegno per la risposta. Grazie. Anche se questo funziona. Ho una domanda - se l'ambito è sbagliato come posso visualizzare currentPage sul template usando '{{currentPage}}'.Con la domanda voglio capire meglio di $ scope. per la soluzione avrei potuto usare l'attributo 'on-select-page'. –

+0

Perdonami per un lavoro, ma risposta sbagliata, oggi è la mia 17a ora e di solito sono incline agli errori fino a tardi. L'ambito è corretto, ma quando è nidificato, lega i tuoi vars ad un livello più profondo, cioè $ scope.data.currentPage e funzionerà benissimo vedi https://github.com/angular/angular.js/wiki/Understanding-Scopes vedere l'esempio di lavoro: http://plnkr.co/edit/2zY91RofKrmUf2zpMuPf?p=preview – Max

+0

"è la mia 17a ora" >> nessun problema :) _ "Quando sono coinvolti gli ambiti nidificati, associare i tuoi vars a un livello più profondo" _ >> rende senso. grazie per la compensazione. –

1

Perché si sta creando un nuovo controller (ModalDialogBaseCtl) all'interno del controllore TestCtrl, angolare creerà un nuovo ambito, che eredita tutte le proprietà dal suo genitore.

La riga che mi sembra sospetta è dove si assegna un valore a $ scope.currentPage all'inizio di ModalDialogBaseCtrl. Angular interpreterà questo come dichiarando una nuova variabile chiamata currentPage nel nuovo scope. Tuttavia, il controllo della paginazione è collegato alla variabile currentPage in MainCtrl, quindi guardando ModalDialogBaseCtl non si fa nulla (non cambia mai valore).

Una correzione consiste nell'utilizzare $ padre come suggerisce Max, ma non è una struttura grandiosa. Invece, prova a trovare un modo per avere solo una proprietà currentPage invece di due.

+0

Grazie per aver risposto in primo luogo. _ "creare un nuovo controller ... creerà un nuovo ambito" _ >> Sono consapevole di questo fatto. _ "Sto assegnando un valore a $ scope.currentPage all'inizio di Ctrl" _ >> anche senza questo risultato è uguale. _ "prova a trovare un modo per avere solo una proprietà currentPage invece di due." _ >> beh non posso pensare a una soluzione qui, * Ho una lista principale visualizzata usando 'TestCtrl' che usa' currentPage' quindi non posso rimuovere da lì *. Può essere che tu possa suggerire qualcosa qui. Sono d'accordo sul fatto che non sia una grande struttura se devo usare '$ parent' per accedere a qualsiasi oggetto $ scope –

Problemi correlati