2015-07-02 8 views
37

Sto utilizzando ionic v1.0.0 e non capisco come funziona la cronologia parallela gestita da $ionicHistory.Come funziona la cronologia ionica e quando viene creata una pila non root?

Soprattutto sui dispositivi Android, quando si utilizza il pulsante indietro (precedentemente hardware), la mia app Angolare a volte si comporta in modo strano e mi piacerebbe capire perché. (esempio: tornando indietro si apre una vista chiusa da $ionicGoBack() molto tempo fa)

Per me sembra che alcune delle navigazioni del router USB creino nuovi stack di cronologia e altri inseriscano gli elementi della cronologia nella cronologia di root, anche quando si passa da stato a stato secondario deve essere aggiunto alla cronologia in cui lo stato è registrato IMO.

Domande

  • Qualcuno può spiegare in quali casi ui-sref o elementi della cronologia $state.go(...) aggiungere a una pila di nuova creazione?
  • Quando vengono aggiunti a root?
  • Le modali sono trattate in modo speciale?

Ci scusiamo per non essere più specifici, ma l'app è piuttosto complicata e non so come isolare i problemi in un singolo plunkr. Forse ho perso un pezzo di buona documentazione ...

+0

Eventuali feedback per la risposta? – LeftyX

+0

@LeftyX la tua risposta è stata molto utile. Suppongo che ci sia un bug nell'implementazione di ionico, perché sono riuscito a risolvere alcuni problemi con la navigazione, specialmente quando si utilizza Side Menus. BTW Ho implementato una [Hardware-Back Simulation for Browser] (http://stackoverflow.com/a/31617294/2176962) che mi ha aiutato a testare molti scenari con problemi di navigazione. – hgoebl

+0

Sì, si spera che a un certo punto qualcuno lo aggiusterà. Ho controllato la tua soluzione. Interessante. Saluti. – LeftyX

risposta

30

Proverò a rispondere a questa domanda anche se potresti non trovare tutte le informazioni che stai chiedendo.

Molte persone - incluso me stesso - sembrano faticare per capire come funzionano il sistema di navigazione e la storia.

Ho risposto a un question in precedenza cercando di spiegare perché le cose non funzionano come previsto. Sembra che la navigazione tenga traccia di ogni vista che l'utente ha visitato utilizzando una collezione. In realtà ci sono 2 collezioni nell'oggetto $ionicHistory. Il primo $ionicHistory.viewHistory().views sembra tenere traccia di ogni vista visitata nello stack corrente mentre l'altro $ionicHistory.viewHistory().histories tiene traccia di tutte le cronologie per l'intera app.

Si potrebbero avere diversi tipi di cronologia per tabulazioni, sidemenus o viste regolari.

È possibile vedere come funzionano le storie indipendenti parallele in questo codepen.
Ci sono 2 storie diverse lì. Uno è per la scheda home e il secondo è per la scheda about.

Navigando tra gli elementi secondari in ciascuna scheda e tornando alla scheda precedente, si noterà che il sistema di navigazione ricorda lo stato precedente.

Ho preparato un altro plunker qui dove è possibile vedere come funziona la navigazione con alcuni dettagli visualizzati nella pagina.

La raccolta di viste $ionicHistory.viewHistory().views viene aggiornata ogni volta che l'utente visita una nuova pagina (la vista corrente nella raccolta è racchiusa tra parentesi quadre).

Se la vista è stata aggiunta alla raccolta, non sarà (non dovrebbe) essere aggiunta di nuovo.

È possibile modificare il comportamento di compensazione della storia ($ionicHistory.clearHistory()) o impostando la radice per la storia attuale:

$ionicHistory.nextViewOptions({ 
    historyRoot: true 
}); 

Nella pagina fattura del mio plunker c'è un tasto verde (Altro Root View). Quando viene premuto ho impostato la nuova radice storia e cambiare stato:

$ionicHistory.nextViewOptions({ 
    historyRoot: true 
}); 
$state.go('otherviewroot'); 

Le cose funzionano come previsto e infatti ora non ho una vista posteriore e il mio stack contiene solo la vista corrente.

cose si incasinato quando si tenta la sequenza:

Home - Contacts - Invoices - Home (button in the header). 

Ora è sembra ionico ha perso il controllo della sequenza e mantiene sull'aggiunta di vista alla collezione.

Premendo il pulsante home è necessario deselezionare il pulsante Indietro, poiché siamo nella radice per la cronologia corrente, ma non accade.

L'utilizzo ripetuto dello stesso motivo aumenta la dimensione della raccolta indefinitamente.

Immagino che questo non sia il comportamento giusto e che sia necessaria una correzione.

Tornando alla tua domanda.

Il pulsante Indietro in Android funziona ... il che significa che segue lo stesso schema.

I moduli per fortuna non vengono considerati come visualizzazioni regolari e non influiscono sulla raccolta.

+0

ha esaminato la tua risposta sopra e mi sto chiedendo se la tua risposta mi può aiutare. Sto cercando un metodo che impone la vista per Tab2_SubPage1 per restituire la visualizzazione di radice per Tab2 se un utente si sposta da Tab2_SubPage1 direttamente a Tab1 (lasciando la vista Tab2 nella pagina cache SubPage1) e l'utente modifica i dati in Tab1. Se l'utente modifica i dati in Tab1, un nuovo elenco di informazioni deve essere visualizzato in Tab2, ma quando l'utente torna a Tab2, la vista è la versione di dati memorizzata nella cache di Tab2_SubPage1. qualche idea? Can histories ... o un altro metodo può essere usato per fare questo? – rolinger

+0

@rolinger: Mi dispiace ma non posso aiutarti con questo. A causa di tutti i bug che avevo trovato in Ionic in quel momento ho deciso di passare a un framework diverso. Problemi con navigazione e cronologia non sono mai stati risolti in Ionic 1. Quello che ho fatto per risolvere i miei problemi era disabilitare la cronologia. Saluti. – LeftyX

3

Come ulteriori informazioni al post precedente.

Uno stack cronologia è sempre collegato a un modello "ion-nav-view". Quindi lo stack cronologia di root viene creato per il primo elemento "ion-nav-view".

Se si pensa di utilizzare diverse pile di storia vi consiglio di collegare sempre l'ione-nav-vista di un nome della vista: <ion-nav-view name="default"></ion-nav-view> invece di <ion-nav-view></ion-nav-view>

In questo CodePen si dispone di un RootStack per le pagine scheda e le altre pagine (denominate "schede", "altro", "altro1") e quindi all'interno delle pagine delle schede si dispone di una sottofila per ogni scheda. Le pagine delle schede e altre pagine vengono eseguite all'interno della vista Root ion-nav. Durante i miei test avevo bisogno di assegnare un nome alla radice ion-nav-view e quindi fare riferimento a questo nome vista nel controller. Altrimenti lo stack è stato sempre ricreato quando si passa tra le pagine principali (Altro => Schede => Altro => ..)

Html per Root Stack:

<ion-nav-view name="default"></ion-nav-view> 

Controller:

.state('other', { 
     url: "/other", 
     views: { 
     'default': { 
      templateUrl:  "templates/other.html", 
     } 
     }, 
.state('tabs', { 
     url: "/tab", 
     abstract: true, 
    views: { 
     'default': { 
      templateUrl:  "templates/tabs.html", 
     } 
    } 
    }) 

All'interno del modello di schede ho assegnato un nuovo ionico-nav-view per i diversi stack scheda (come si è fatto in il modello di schede ionica default)

Ad esempio per la casa-scheda (e stack di casa) l'Html si presenta così (home page, fatti):

<ion-nav-view name="home-tab"></ion-nav-view> 

Controller:

.state('tabs.home', { 
     url: "/home", 
     views: { 
     'home-tab': { 
      templateUrl: "templates/home.html", 
     }, 

     } 
    }) 
    .state('tabs.facts', { 
     url: "/facts", 
     views: { 
     'home-tab': { 
      templateUrl: "templates/facts.html", 
     },   
     } 
    }) 

Ho anche presentato un bug report per il codepen sopra. Sta passando erroneamente attraverso le storie. https://github.com/driftyco/ionic/issues/4086

Non sono sicuro della mia correzione. Forse la funzione cronologia deve essere ridisegnata più globalmente per risolvere i problemi ..

+0

funziona molto bene per me. Grazie! – jovani