2015-12-29 27 views
6

Sto usando, Angular.js 1.3, con ui-router. Ho 3 pagine, pagina1.html, pagina2.html, pagina3.html.

Quando l'utente fa clic sulla pagina 1, la pagina 2 si aprirà, ma voglio salvare lo stato di scorrimento della pagina 1, in cui l'utente era prima di fare clic, in modo che dopo aver fatto clic sul pulsante Indietro atterra sullo stesso stato di scorrimento.

per risolvere questo ho aperto il page2.html sul page1.html, in iframe, e dandogli posizione assoluta per visualizzare il page1.html, e sto usando la:

history.pushState({}, '', '/page2.html');

per cambiare l'URL. Questa implementazione funziona bene.

Ora quando l'utente clicca sul link page2.html, dovrebbe aprire la page3.html, come un normale link, per il quale ho usato:

$state.go("page3") 

Il problema è ora il chages statali, e pagina3 .html carica, ma url è ancora il /page2.html, l'URL non sta cambiando.

Ho anche provato:

history.pushState({}, '', '/page3.html'); 

Ancora url non cambia. Qualcuno sa perché sta succedendo.

+0

Non sono sicuro che funzionerà.ma immagino che tu sia in 'Iframe', ecco perché non sta cambiando questo URL. puoi provare 'eval' quando sei in pagina2. potrebbe essere 'parent.eval ($ state.go (" pagina3 "))' qualcosa come questo. –

+0

Puoi pubblicare un JSFiddle? –

+0

Mi spiace non posso postarlo su jsfiddle. Ma sì, posso capire che il link è in iframe, ecco perché non sta cambiando url (probabilmente). Ma il codice js funziona bene, history.pushState è in esecuzione (Js source debugger), ma non ha alcun effetto sull'URL. Scava di più su iframe. –

risposta

0

Anche se la soluzione che si sta cercando di attuare è molto creativo, vorrei davvero scelto un'altra direzione.

Hai varie possibilità, ognuno dei quali si basano su caching la posizione di scorrimento da qualche parte. Ad esempio:

var scrollTopData = {}; 

function changeState (toState) { 
    var currentStateName = $state.current.name; 
    scrollTopData[currentStateName] = window.scrollY; 
    $state.go(toState); 
} 

Quindi la domanda rimane cosa fare con la posizione di scorrimento che si è memorizzata nella cache. $state.go restituisce una promessa, quindi una soluzione potrebbe essere:

var scrollTopData = {}; 

function changeState (toState) { 
    var currentStateName = $state.current.name; 
    scrollTopData[currentStateName] = window.scrollY; 

    $state.go(toState).then(function() { 
     if (toState in scrollTopData) { 
      window.scrollTo(0, scrollTopData[toState]); 
     } 
    }); 
} 

seconda dell'implementazione, si potrebbe anche usare la risposta di asgoth:

Non ho usato prima, ma ha un angolare Servizio $anchorScroll. Per ricaricare i dati, è possibile memorizzarli nella cache utilizzando $cacheFactory o archiviare i dati su un ambito più elevato.

Un'altra soluzione sarebbe utilizzare un stateChangeEvent. Per esempio:

$rootScope.$on('$stateChangeSuccess', 
    function (event, toState, toParams, fromState, fromParams) { 
     // Do magic 
    } 
); 

Il mio consiglio sarebbe quello di utilizzare la promessa restituito da $state.go.

+0

Sì, grazie per queste informazioni. Ma il mio progetto coinvolge lo scroll infinito: al primo caricamento, l'API fornisce il primo 20 prodotto, quindi lo scorrimento del prossimo 20 viene, quindi se l'utente ha fatto scorrere verso il basso fino al 3 ° e fare clic sull'elemento, quindi premere il pulsante indietro, l'API viene chiamata dall'avvio, quindi il salvataggio del punto di scorrimento non è utile, poiché i dati non sono disponibili. La mia soluzione attuale mostra la pagina cliccata in cima, rimuovendola così su popstate salva di nuovo l'hit dell'API e rimane nella stessa posizione di prima. –

+0

Bene, queste informazioni sarebbero state utili prima di rispondere :) Ad ogni modo, il concetto rimane lo stesso, con un'aggiunta: puoi inserire il numero di pagina che stai utilizzando quando carichi più articoli nel percorso con hash. Quando viene caricata la pagina di scorrimento infinita, controllare il numero di pagina, caricare tutto fino a quello e scorrere la finestra fino all'ultima posizione di scorrimento conosciuta. – pesla

0

Non si può avere un cambiamento di URL se si modifica il comportamento predefinito di angolare. La parte in url dopo l'hash cambia automaticamente. Non si dispone di URL che cambiano perché si forza il browser per /somepage.html

provare qualche cosa come /#somepage.html

nota il cancelletto (#), ha aggiunto qui.