Action Sheets

Alexander A. Ramírez M.

Ya hemos visto que en el caso de las listas (ion-list) es posible utilizar ion-delete-button, ion-reorder-button, ion-option-button.

Ahora vamos a trabajar con un menú emergente denominado Action Sheet que suele aparecer cuando hacemos un gesto de quedar presionando un elemento de usa lista o sencillamente presionamos un botón. Este menú aparece en la parte inferior de la pantalla y ofrece opciones relacionadas con el elemento con el cual se está interactuando, es decir, es un menú contextual, no es general. Es un menú asociado al elemento y suele ofrecer las acciones relacionadas con el elemento con el que se interactua.

Ingrese a play.ionic.io para obtener el código para iniciar el tutorial y haga FORK. No olvide hacer FORK.

El objetivo es:

En el HTML, se debe definir qué acción o interacción por parte del usuario va a activar el Action Sheet. Hemos decidido utilizar un gesto denominado on-hold que consiste en que el usuario mantiene presionado un elemento o un botón por más de 500ms. La forma de capturarlo es especificar en el elemento la directiva on-hold e indicar la rutina que va a manejar el evento en el controlador.

<ion-item on-hold="showActionSheet(item)" ng-repeat="item in items">

A continuación la rutina que lo maneja

$scope.showActionSheet = function (i) {
  alert('Action Sheet '+i.id);
}

Como puede observar al mantener presionado el elemento de la lista aparece una alerta con el número del item.

Ahora vamos a inyectar el servicio $ionicActionSheet en el controlador. Para fines del ejercicio también vamos a inyectar $timeout

.controller('contentController', 
  function($scope, dataService, $ionicListDelegate, 
    $ionicActionSheet, $timeout){

Ahora vamos a implementar showActionSheet agregando un botón para cancelar, otro para borrar, uno para mover un item arriba y otro para mover un item abajo, aprovechando el código de los tutoriales previos.

$scope.showActionSheet = function (item) {
  $ionicActionSheet.show({
    titleText: 'Manipula elementos de la lista...',
    buttons: [
      { text: 'Subir' },
      { text: 'Bajar' }
    ],
    buttonClicked: function(index, buttonObj) {
      switch(index) {
        case 0:
          dataService.upData(item,$scope.items.indexOf(item));
          return true;
        case 1:
          dataService.downData(item,$scope.items.indexOf(item));
          return true;
      }
    },
    destructiveText: 'Borrar',
    destructiveButtonClicked: function() {
      dataService.deleteData($scope.items.indexOf(item));
      return true;
    },
    cancelText: 'Cancelar',
    cancel: function() {}
  });
}

Para mantener el orden se definió el título con titleText, luego los botones (realmente opciones) con buttons y el manejo del evento con buttonClicked. Luego el texto de la acción “peligrosa” como Borrar usando destructiveText y destructiveButtonClicked y por último la opción de cancelar con cancelText y la función cancel.

Por último leyendo la documentación resulta que $ionicActionSheet.show() retorna una función que cuando la invocas oculta y cancela el ActionSheet.

La rutina showActionSheet queda así:

$scope.showActionSheet = function (item) {
  var functionToHideSheet = $ionicActionSheet.show({
    titleText: 'Manipula elementos de la lista...',
    buttons: [
      { text: 'Subir' },
      { text: 'Bajar' }
    ],
    buttonClicked: function(index, buttonObj) {
      switch(index) {
        case 0:
          dataService.upData(item,$scope.items.indexOf(item));
          return true;
        case 1:
          dataService.downData(item,$scope.items.indexOf(item));
          return true;
      }
    },
    destructiveText: 'Borrar',
    destructiveButtonClicked: function() {
      dataService.deleteData($scope.items.indexOf(item));
      return true;
    },
    cancelText: 'Cancelar',
    cancel: function() {}
  });
  
 $timeout(function() {
   functionToHideSheet();
 }, 3000);
}

Si en tres segundos no se hace nada el ActionSheet se cierra solo ayudado con el servicio $timeout.

Si desea ver el resultado lo puede revisar. Otro ejemplo hecho en clase.