2015-03-03 28 views
6

Ho un progetto Sto usando angularJS con ui.router e abbiamo una lista di eventi che possono essere veramente lunghi (ha scroll infiniti) se un utente clic su un evento per visualizzare i dettagli viene visualizzato un pulsante indietro, tuttavia, facendo nuovamente clic sul rotolo dei ripristini div in cima! Alla ricerca di qualche suggerimento se c'è qualcosa di costruito in cui potrei fare leva per ricordare questa posizione di scorrimento, so che c'è il servizio di ancoraggio, ma mi chiedo se non ci sia qualcosa di più adatto a fermare l'angolazione dal resettare le posizioni di scorrimento sulla navigazione ?? poiché ci sono alcuni elenchi simili a questo che hanno bisogno di ricordare il loro stato quando si scorre. Ho esaminato e provato a implementare ui-router-extras dsr e sticky ma nessuno dei due sta funzionando ..
esempio http://codedef.com/hapzis_poc/. non è una prova completa, ma dovrebbe essere in grado di scorrere verso il basso gli eventi, fare clic su e indietro e rimanere nella stessa posizione di scorrimento.Come "ricordare" la posizione di scorrimento in angularJS w/Ui.ROUTER

risposta

0

Affinché gli stati appiccicosi funzionino, è necessario che non distruggano l'elemento DOM. Osservando la struttura dello stato, si utilizza la vista ui con nome body per lo stato home, secondo la documentazione di ui-router-extras. Tuttavia, in seguito si verifica un clobber di tale elemento di visualizzazione ui durante la transizione allo stato about, che utilizza anche la vista ui body. Questo può essere osservato ispezionando il DOM.

.state('home', { 
     url: "", 
     deepStateRedirect: true, 
     sticky: true, 
     views: { 
      "body": { 
       templateUrl: 'templates/home.html' 
      }, 
      "[email protected]": { 
       sticky: true, 
       templateUrl: "templates/eventList.html", 
       controller: "eventListCtrl" 
      } 
     } 
    }) 
    .state('about', { 
     url: 'about', 
     views: { 
      "body": { // BAD, you just clobbered the sticky ui-view with this template 
       templateUrl: 'templates/about.html' 
      } 
     } 
    }); 

Assicurarsi ui vista dello stato appiccicoso non viene riutilizzato. Per il tuo esempio, inserisci lo stato about nella visualizzazione senza nome.

.state('about', { 
     url: 'about', 
     templateUrl: 'templates/about.html' 
    }); 

index.html:

<div ui-view="body" ng-show="$state.includes('home')"></div> 
<div ui-view></div> 

js:

app.run(function($rootScope, $state) { $rootScope.$state = $state }); 
1

C'è una conversazione sul soggetti simili (ng-view) e la risposta data dal @ BR2000 ha lavorato per me.

https://stackoverflow.com/a/25073496/3959662

per fare il suo lavoro di direttiva per ui-router effettuare le seguenti operazioni:

1. Creare nuova direttiva in questo modo:

(function() { 
    'use strict'; 

    angular 
     .module('your.module.directives') 
     .directive('keepScrollPos', keepScrollPos); 

    function keepScrollPos($route, $window, $timeout, $location, $anchorScroll, $state) { 

     // cache scroll position of each route's templateUrl 
     var scrollPosCache = {}; 

     // compile function 
     var directive = function (scope, element, attrs) { 

      scope.$on('$stateChangeStart', function() { 
       // store scroll position for the current view 
       if($state.$current) 
       { 
        scrollPosCache[$state.current.templateUrl] = [$window.pageXOffset, $window.pageYOffset]; 
       } 
      }); 

      scope.$on('$stateChangeSuccess', function() { 
       // if hash is specified explicitly, it trumps previously stored scroll position 
       if ($location.hash()) { 
        $anchorScroll(); 

       // else get previous scroll position; if none, scroll to the top of the page 
       } else { 
        var prevScrollPos = scrollPosCache[$state.current.templateUrl] || [0, 0]; 
        $timeout(function() { 
         $window.scrollTo(prevScrollPos[0], prevScrollPos[1]); 
       }, 0); 
      } 
     }); 
    }; 

    return directive; 
} 
})(); 

2. usarlo su l'elemento avere l'attributo ui-view, nel mio caso:

<div class="col-xs-12" ui-view keep-scroll-pos></div> 
+0

$ timeout (function() {$ window.scrollTo (prevScrollPos [0], prevScrollPos [1]); }, 1000); => aspetta 1 secondo per la pagina da renderizzare ... –