2013-12-18 5 views
10

Sto provando a creare una semplice direttiva di impaginazione con un ambito isolato. Per qualche motivo, quando cambio manualmente il valore, diventa un po 'schizzinoso. Ecco il mio problema:Ingresso AngularJS modello ng non aggiornato

Quando pagina avanti e indietro, funziona alla grande. Impressionante

Quando inserisco una pagina nel campo funziona. Great

Tuttavia, se inserisco una pagina nel campo e poi provo ad andare avanti e indietro, il modello ng sembra rompere dopo aver inserito una pagina nel campo. L'ho fatto funzionare quando non ho isolato il mio telescopio, ma sono confuso sul motivo per cui lo romperà. Ecco il mio codice:

HTML:

<paginate go-to-page="goToPage(page)" total-pages="results.hits.pages" total-hits="results.hits.total"></paginate> 

direttiva:

'use strict'; 

angular.module('facet.directives') 
    .directive('paginate', function(){ 
     return { 
      restrict: 'E', 
      template: '<div class="pull-right" ng-if="(totalPages !== undefined) && (totalPages > 0)">'+ 
       '<span class="left-caret hoverable" ng-click="changePage(current-1)" ng-show="current > 1"></span>&nbsp;&nbsp;Page'+ 
       '&nbsp;&nbsp;&nbsp;<input type="number" ng-model="current" class="pagination-input" ng-keypress="enterPage($event)"/> of'+ 
       '&nbsp;&nbsp;&nbsp;{{totalPages}}&nbsp;&nbsp;'+ 
       '<span class="right-caret hoverable" ng-click="changePage(current+1)" ng-show="current < totalPages"></span>'+ 
      '</div>', 
      scope: { 
       goToPage: '&', 
       totalPages: '=', 
       totalHits: '=' 
      }, 
      link: function(scope) { 
       scope.current = 1; 
       scope.changePage = function(page) { 
        scope.current = page; 
        window.scrollTo(0,0); 
        scope.goToPage({page:page}); 
       }; 
       scope.enterPage = function(event) { 
        if(event.keyCode == 13) { 
         scope.changePage(scope.current); 
        } 
       } 
      } 
     } 
    }); 

Che cosa sto facendo di sbagliato?

+0

Potresti impostare un jsFiddle o Plunkr? –

risposta

11

Si prega di cercare sempre di utilizzare il modello invece di usare i tipi primitivi mentre si utilizza il modello ng causa delle gerarchie prototipo del javascript.

angular.module('facet.directives').directive('paginate', function() { 
    return { 
     restrict: 'E', 
     replace: true, 
     template: '<div class="pull-right discovery-pagination" ng-if="(totalPages !== undefined) && (totalPages > 0)">' + 
      '<span class="left-caret hoverable" ng-click="changePage(current-1)" ng-show="current > 1"></span>&nbsp;&nbsp;Page' + 
      '&nbsp;&nbsp;&nbsp;<input type="number" ng-model="current.paging" class="pagination-input" ng-keypress="enterPage($event)"/> of' + 
      '&nbsp;&nbsp;&nbsp;{{totalPages}}&nbsp;&nbsp;' + 
      '<span class="right-caret hoverable" ng-click="changePage(current+1)" ng-show="current < totalPages"></span>' + 
      '</div>', 
     scope: { 
      goToPage: '&', 
      totalPages: '=', 
      totalHits: '=' 
     }, 
     link: function(scope) { 
      scope.current = {paging:1}; 
      scope.changePage = function(page) { 
       scope.current.paging = page; 
       window.scrollTo(0, 0); 
       scope.goToPage({ page: page }); 
      }; 
      scope.enterPage = function(event) { 
       if (event.keyCode == 13) { 
        scope.changePage(scope.current.paging); 
       } 
      }; 
     } 
    }; 
}); 

Spero che questo risolverà il vostro problema :)

Per dettagli su questo, si prega di passare attraverso Understanding-Scopes

+0

Questo l'ha fatto! Molte grazie. – user1200387

+0

"Se non hai un punto, lo stai facendo male" Lampadina! https://www.youtube.com/watch?v=ZhfUv0spHCY&feature=youtu.be&t=30m –

15

Attenzione a ng-if - crea un nuovo ambito. Se lo cambi solo con ng-show, il tuo esempio funzionerebbe correttamente. Se si desidera utilizzare ng-if, creare un oggetto per memorizzare la variabile di ambito current. Forse qualcosa come scope.state.current?

scope.state = { 
    current: 1 
}; 

Per evitare confusione come questo, tengo sempre i miei attacchi come something.something e mai solo something.

Edit: buona spiegazione qui - http://egghead.io/lessons/angularjs-the-dot

+3

Santo *** quel video. Mi ha aperto gli occhi su tanti "problemi" che io e il mio team avevamo con alcuni attacchi angolari. Li abbiamo attribuiti a stranezze di input HTML o altro, ma sono abbastanza sicuro che il punto mancante era il problema. –

+0

Oh, accidenti! Mi sono tirato i capelli, perché non avrebbe funzionato più. Mi sono dimenticato di quello scopo 'ng-if' ... –