Quantcast

Navigation Ionic y su Navcontroller

Aitor Sánchez - Blog - Oct. 27, 2023, 11:50 a.m.

¿Buscando información sobre NavController, o navigation, del framework Ionic? O, quizás, lo que quieres es saber cómo podemos navegar entre las páginas de nuestra aplicación ¿verdad?

Mi nombre es Aitor Sánchez, soy desarrollador de apps desde el año 2014, y cuando termines con este artículo sabrás navegar entre las páginas de tu aplicación Ionic igual que el capitán Jack Sparrow surca los mares a los mando de la Perla Negra.

Pero antes de continuar, esta es la Flutter Mafia. Es mi newsletter donde aprenderás desarrollo de apps móviles, aso y monetización junto con otros genietes que ya están dentro. Y si te suscribes te regalo mi ebook "Duplica los ingreso de tus apps en 5 minutos" No es broma, quizás te interese.

 

 

Cómo configurar NavController

Ahora vamos a ver un ejemplo de código muy sencillo en el que observamos un uso básico, pero funcional, de este módulo, que, por cierto, pertenece al paquete “@angular/core”.

import { NavController } from 'ionic-angular';

class MyComponent {
  constructor(public navCtrl: NavController) {

  }
}

 

 

En primer lugar, necesitamos realizar una importación del módulo NavController en la clase donde lo vayamos a usar.

Posteriormente, y como en la mayoría de los componentes, necesitamos realizar una inyección en el constructor para poder utilizarlo.

Y listo, ya tenemos todo preparado para empezar a utilízalo.

 

Navigation Ionic, como se usa

Nota: El trasfondo del componente es, en pocas palabras, un array que almacena el uso de la aplicación para poder controlar si avanzando o si volvemos atrás sobre el Navigation. Lo mete todo en una pila y va añadiendo o quitando páginas a nuestra voluntad. Ya sean páginas, como tal, o tabs. Es el mismo componente que el navcontroller de Angular, por si lo has utilizado alguna vez.

En el punto anterior hemos visto cómo se configura el módulo, ahora vamos a ver como lo podemos usar.

Primero hay que explicar que existen 2 tipo de datos dentro del array que hemos explicado más arriba. Uno es el Root Page y otro son el resto de las ventanas agregadas. Definiendo Root Page como la página principal o primaria.

 

La Root Page y cómo podemos cambiar de página con Navigation

Bien, ahora tendremos que fijarnos muy bien la etiqueta ion-nav. Esta etiqueta será la más importante del siguiente ejemplo:

import { Component, ViewChild } from '@angular/core';
import { NavController } from 'ionic-angular';

@Component({
   template: '<ion-nav #myNav [root]="rootPage"></ion-nav>'
})
export class MyApp {
   @ViewChild('myNav') nav: NavController
   public rootPage: any = TabsPage;

   // Wait for the components in MyApp's template to be initialized
   // In this case, we are waiting for the Nav with reference variable of "#myNav"
   ngOnInit() {
      // Let's navigate from TabsPage to Page1
      this.nav.push(Page1);
   }
}

 

Otra cosa importante, fíjate bien cómo accedemos al navctrl. Lo referenciamos en nuestro código TS mediante el decorador @ViewChild.

Una vez que abrimos la app por primera vez, el mismo sistema nos pone por defecto en el Root Page la primera página de la aplicación. Siempre y cuando no lo hayamos configurado de otra manera de forma explícita.

En el código vemos cómo podemos hacer un push de otra página sobre la página principal. De esta manera logramos que el usuario vea otra página y esta, la que estamos pusheando, se meta dentro del array de páginas que lleva el sistema navController.

En caso de que pulsemos sobre el botón “atrás” o le digamos explícitamente, ves hacia atrás, que lo veremos más abajo, esta página será eliminada de la cola, y volveremos a la página anterior. En este caso concreto, la Root Page.

 

Cambiar el Root Page, o página raíz

Nota: Si no sabes lo que es la página raíz, será la página que está en la posición 0 del stack. La página que una vez en ella al pulsar sobre el botón "back" se saldrá de la aplicación.

Por otro lado, y como era de esperar, se puede cambiar la Root Page de la app. Para que, en el siguiente cambio de ventana, esta pase a ser la principal. Recuerda que esta función elimina toda la cola anterior y pone esta página, la que le vamos a pasar, como principal.

setRoot(newRootPage){
    this.nav.setRoot(newRootPage);
}

 

Como vemos en el ejemplo (este es muy sencillo), llamamos a la función setRoot del navController y le pasamos la nueva ventana. A partir de ahora toda la pila comenzará a partir de ahí.

 

Quitando vistas del stack

Aunque antes hemos visto un poco como se realiza este paso, vamos a especificar y ahondar un poquito más sobre esta funcionalidad.

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';

@Component({
  template: `
  <ion-header>
    <ion-navbar>
      <ion-title>Other Page</ion-title>
    </ion-navbar>
  </ion-header>
  <ion-content>I'm the other page!</ion-content>`
})
class OtherPage {
   constructor(public navCtrl: NavController ){
   }

   popView(){
     this.navCtrl.pop();
   }
}

 

 

La verdad que es algo sencillo. Con el método “pop()” hacemos que el stack retroceda en un espacio. La lógica es la misma que cuando pulsamos sobre el botón “back” del dispositivo. Es más, por debajo, al pulsar “back” se ejecuta el mismo código, a excepción de que hayamos sobrescrito la lógica de este.

 

Ciclos de vida de una vista sobre la navegación / navigation

Ahora vamos a pasar a comentar el ciclo de vida de una vista, y los eventos que se ejecutan. Eventos que podemos sobrescribir para darles la funcionalidad que nosotros queramos.

  • ionViewDidLoad -> void -> Se ejecuta cuando la página ha sido cargada. Se suele para configurar toda la parte previa a la muestra del usuario.
  • ionViewWillEnter -> void -> Se ejecuta cuando la página está a punto de mostrarse y se convierte en página activa.
  • ionViewDidEnter -> void -> Se ejecuta cuando la página acaba de mostrarse y está activa. Se ejecutará ya sea la primera vez que se carga la página o sea una página cacheada.
  • ionViewWillLeave -> void -> Se ejecuta cuando la página está a punto de desaparecer y ya no está activa.
  • ionViewDidLeave -> void -> Se ejecuta cuando la página ya ha desaparecido y no está activa.
  • ionViewWillUnload -> void -> Se ejecuta cuando la página está a punto de destruirse y ya no tiene elementos.
  • ionViewCanEnter -> boolean/promise -> Se ejecuta después de que la página este mostrándose y activa.
  • ionViewCanLeave -> boolean/promise -> Se ejecuta cuando ya se ha salido de la página en cuestión.

 

Nav Guards, o como interceptar vistas.

En determinadas ocasiones, se nos plantea el problema de que tenemos que controlar cuando un usuario entra o sale de una determinada página/ventana. Hemos visto los métodos antes, los dos últimos, ionViewCanEnter y ionViewCanLeave. Solo tendremos que sobrescribirlos y ya podremos tomar acción sobre lo que hace el usuario dentro de la pantalla.

Ahora veamos un ejemplo que se aprecia mucho mejor.

export class MyClass{
 constructor(
   public navCtrl: NavController
  ){}

  pushPage(){
    this.navCtrl.push(DetailPage);
  }

  ionViewCanLeave(): boolean{
   // here we can either return true or false
   // depending on if we want to leave this view
   if(isValid(randomValue)){
      return true;
    } else {
      return false;
    }
  }
}

 

 

NavOptions y cómo se aplican

Los métodos de NavController que nos permite cambiar de página pueden recibir unos parámetros con los que podemos cambiar el comportamiento de esta.

  • animate -> boolean -> Si quieres que la transición de ventanas se anime.
  • animation -> string -> La animación que queremos aplicar en esta.
    • md-transition
    • ios-transition
    • wp-transition
  • direction -> string -> La dirección conceptual que queremos que realice la transición.
    • forward -> La transición se hará de derecha a izquierda.
    • back -> La transición se hará de izquierda a derecha.
  • duration -> number -> El tiempo que queramos que dure la transición.
  • easing -> string -> La flexibilidad de la animación.

 

Cómo usar la clase LocationStrategy del NavController para navegar al forward y al backward

El router de Angular tiene un método llamado LocationStrategy.historyGo que permite a los desarrolladores moverse al forward y al backward mediante el histórico de ventanas de la aplicación. Veamos un ejemplo que lo entenderás mejor.

Digamos que tenemos el siguiente histórico de navegación:

/pageA --> /pageB --> /pageC

Si llamas a "LocationStrategy.historyGo(-2) desde la página "/pageC", volverias a la página "/pageA". Si después lo usamos así: "LocationStrategy.historyGo(2), volveremos a la página "/pageC".

A parte, esta clase tiene campos y métodos para conocer más detalles sobre el histórico de navegación que te invito a que revises por tu cuenta.

Lo último a comentar aquí, es que si la aplicación no hace una carga lineal de la navegación, es aconsejable que montes un servicio que te permita saber dónde está el usuario en todo momento y las página por las que ha pasado.

 

Funciones y campos del NavController

Como ya tenemos una idea bastante amplia de lo que es el NavController y el Navigation y de cómo podemos usarlo, vamos a ver de manera más avanzada lo que podemos hacer con ella. Mediante sus funciones y campos de clase.

 

canGoBack()

Esta función nos permite comprobar si podemos usar “NavController.pop()” o el botón de retroceder sin que la aplicación se cierre. También nos permite conocer si estamos sobre la Root Page.

  • Retorno -> booleano -> Nos permite conocer si hay más páginas en el stack de páginas.

 

canSwipeBack()

Lo mismo que la función anterior, pero en caso de usar el botón “back” es para comprobar si podemos hacer “swipe back”.

  • Retorno -> booleano -> Nos permite conocer si podemos hacer swipeBack.

 

firts()

Retorna la primera vista que está en el Stack del navController / Navigation

  • Retorno -> ViewController

 

getActive()

Retorna la página activa en el stack de navController

  • Retorno -> ViewController

 

getActiveChildNav()

Retorna el ítem que está activo de la navegación. Por Ejemplo: Si tenemos un menú que tiene “fruta”, “verdura” y “carne” y actualmente estamos viendo “verdura” esta función devolverá el controlador de “verdura”.

  • Retorno -> ViewController

 

getActiveChildNavs()

Similar al anterior, pero con retorno múltiple.

 

getAllChildNavs()

Esta función nos permite conocer todas las opciones que tenemos disponibles en la navegación.

 

getByIndex(index)

Esta función nos devuelve, sobre la pila de páginas, la que nosotros le especifiquemos por parámetro.

  • Index -> number -> El índice que queremos obtener de la pila de páginas.
  • Retorno -> ViewController.

 

getPrevious(view)

Retorna la vista anterior a la que le especifiquemos por parámetros.

  • View -> ViewController -> Es la vista de la que queremos sacar la anterior.
  • Retorno -> ViewController -> La vista anterior a la que le hemos especificado en el punto anterior.

 

getSecondaryIdentifier()

 

getType()

 

getViews()

Retorna todo el stack de páginas que tenemos agendadas en el “navController”.

  • Retorno -> Array<ViewController>

 

getToRoot()

 

indexOf(view)

Esta función nos permite conocer la posición, dentro del índice del stack, de una vista en el Navigation.

  • View -> ViewController -> La vista de la que queremos conocer el índice
  • Retorno -> number -> Es la posición en el índice de la vista solicitada.

 

insert(index, page, params, opts)

Esta función nos permite meter una página dentro del Stack del navController.

  • insertIndex -> number -> El índice dentro del stack en el que queremos que se posicione la vista.
  • Page -> string -> La ruta interna de la página que queremos agregar al stack.
  • Params -> object -> Si queremos que tenga parámetros, aquí se lo tenemos que especificar.
  • Opts -> object -> En caso de que necesitemos definir opciones de transición y demás, como vimos antes en el artículo, este es el lugar.
  • Retorno -> promise -> Una promesa que tenemos que controlar. Se resolverá cuando la transición haya terminado.

 

isActive(view)

Nos permite conocer si la vista en cuestión está activa.

  • View -> ViewController -> La vista de la que queremos conocer los datos.
  • Retorno -> boolean -> Si es verdadero, la vista que le hemos solicitado está activa.

 

isTransitioning()

Nos permite conocer si la vista actual está en fase de transición o no.

  • Retorno -> booleano -> Si es verdadero, la transición aún no ha terminado.

 

last()

Retorna la última página en el Stack de páginas del NavController.

  • Retorno -> ViewController -> La vista siguiente a la que está activa.

 

lenght()

Retorna el número de vistas que hay en el Stack del navController.

  • Retorno -> number -> La longitud del stack.

 

parent

Este campo contiene el padre de la vista que está activa en la actualidad. En caso de que sea el Root Page, parent es igual a null.

 

pop(options)

Esta función nos permite navegar a la página anterior del stack del navController.

  • Options -> object -> Son las opciones de transición de la navegación cuando volvemos atrás.
  • Retorno -> promise -> Una promesa que se resolverá cuando haya terminado la transición.

 

popToRoot(options)

Similar a la anterior, pero en lugar de llevarnos una página atrás, nos llevará hasta el RootPage.

  • Options -> object -> Las opciones de transición que queremos que se apliquen.
  • Retorno -> promise -> Una promesa que tenemos que controlar. Se resolverá cuando la transición haya terminado.

 

push(pare, params, options)

Esta función, como ya hemos visto en ejemplos anteriores, nos permite meter una vista dentro del Stack. Los params serán accesibles desde la clase “NavParams” en la clase objetivo.

  • Pare -> string -> La ruta del componente que queremos agregar al stack.
  • Params -> object -> Los parámetros que queremos enviar a la clase objetivo.
  • Options -> object -> Las opciones de transición que queremos que se ejecuten cuando hace el cambio de página.
  • Retorno -> promise -> Una promesa que se resolverá cuando termine la transición.

 

remove(starIndex, removeCount, options)

Como su propio nombre indica, nos permite eliminar páginas del Stack del navController. Desde un índice dado hasta la cantidad de páginas que queremos eliminar.

  • startIndex -> number -> La posición inicial desde la que queremos comenzar a borrar. Por defecto es la última página del Stack.
  • removeCount -> number -> La cantidad de páginas que queremos eliminar. Por defecto, 0.
  • Options -> object -> Los ajustes de transición del cambio de pantalla.
  • Retorno -> promise -> Se resolverá cuando la transición haya terminado.

 

removeView(view, options)

Elimina la página en cuestión del Stack del Navigation.

  • View -> viewController -> La vista en cuestión que queremos eliminar del Stack.
  • Options -> object -> Las opciones de transición.
  • Retorno -> promise -> Se resolverá cuando la transición haya terminado.

 

setPages(pages, options)

Con esta función podemos agregar vistas al stack de navegación a continuación de la última vista que esté agregada. Por defecto, las opciones de transición estarán desactivadas, pero ahora veremos cómo las podemos activar.

  • Pages -> Array<{page: any, params: any}> -> Estas son las páginas que vamos a agregar al Stack. Pero como puedes observar, cada una de ellas es un objeto que contiene:
    • Page -> string -> Será la ruta de la página en cuestión.
    • Params -> object -> los parámetros que le queremos pasar a la vista.
  • Options -> object -> Estos serán las opciones de transición de todas las páginas en conjunto.
  • Retorno -> promise -> Una promesa que se ejecutará cuando la transición haya terminado.

 

setRoot(page, params, options, done)

Con esta función lo que logramos es definir un nuevo Root Page al sistema eliminando así todo el Stack anterior del Navigation.

  • Page -> string | viewController -> Será la página que en este momento, después de usar la función, será el RootPage.
  • Params -> object -> En caso de que queramos pasar parámetros, este es el sitio.
  • Options -> object -> Las opciones de transición
  • Done -> function -> En caso de que queramos ejecutar una función cuando haya terminado, este es el lugar.
  • Retorno -> promise -> Se resolverá cuando la transición haya terminado.

 

Y por si te gusta más ver que leer, el tutorial en video

 

 

 

Algo más que quizás te interese

Mira, la manera más sencilla de aumentar tus instalaciones, y por extensión el dinero que ganas, de tu aplicación es mejorando el logo. Optimizando, cuidando y mimándolo, es de las cosas que más resultados ofrece en tu ASO. Por eso hemos creado una herramienta para ayudarte con esto. Aquí la tienes, no te espoileo más.

 

Ahora solo queda despedirme y decir que, gracias por estar ahí, como siempre y que nos vemos en el siguiente artículo… Hasta entonces, ¡que vaya bien!

Otros artículos que te pueden interesar

Call Directory Ionic - ¡Qué es y cómo se usa!

¿Necesitas que tu usuario acceda a su directorio de llamadas y contactos desde tu aplicaci...

Popover Ionic | Aprende cómo mostrar contenido ...

¿Quieres saber cómo mostrar esos mensajitos que aparecen al lado de nuestros compon...

FCM Ionic | Aquí te enseño a usarlo cómo un PRO

¿Quieres enviar notificaciones Push en tu aplicación Ionic mediante FCM Ionic c&oac...

Ionic Deep Linking o como indexar páginas de nu...

¿Pensando en meter enlaces profundos en tu app mediante Deep Linking Ionic? O, quizá...

Ionic Toast | Comunícate con tu usuario con est...

¿Buscando una manera de comunicarte con tus usuarios y has optado por un Toast en Ionic? O...

Ionic Bluetooth | Qué es y cómo tu puedes utili...

¿Quieres envair y recibir información con otro dispositivo desde tu app hecha en Io...

Background Mode Ionic - Cómo ejecutar tareas en...

¿Quieres realizar tareas asíncronas en tu aplicación con el componente Backg...

File Transfer Ionic | Aquí tienes la guía más c...

¿Pensando en enviar, o recibir, archivos desde internet en tu app? O, quizás, ya sa...

Ion Select | todo lo que debes saber está aquí

¿Necesitas que tu usuario seleccione un valor de una lista y has pensado en ion-select? O,...