Skip to content
Christian Gastrell edited this page May 18, 2015 · 7 revisions

Una aplicacion simple de tareas

Preparacion

Crear un proyecto nuevo, basandose en templates\jqm:

phonegap create prueba8 --id com.coderhouse.prueba8 --name "00 Prueba 8" -src templates\jqm

Paginas

Navegacion

La idea del flujo de navegacion es simple:

                                      +               
                     Paginas/vistas   |    Rutinas/codigo  
                                      |         
 Input para nueva   +-------------+   |               
 tarea.             |             |   |               
 Listado de         |    index    <-----------+       
 tareas pendientes  |             |   |       |       
                    +-------------+   |       |       
                           |          |       |       
                           |          |       |       
 Click en una tarea +------v------+   |       |       
 muestra pagina     |             |   |   Borrar tarea
 confirmacion:      | confirmacion|   |   seleccionada
 Completada /       |             |   |       |       
 No completada      +-------------+   |       |       
                      |        |      |       |       
                    +-v--------v--+   |       |       
 Mostrar un mensaje |    |        |   |       |       
 alusivo:           |done|not done+-----------+       
 Excelente/Ok...    |    |        |   |               
                    +-------------+   |               
                                      +               

Siguiendo ese flujo, nuestras paginas seran:

Index

Inicialmente solo mostramos un input y un boton Agregar

<div id="index" data-url="index" data-role="page">
  <div data-role="header">
    <h1>Tareas</h1>
  </div>
  <div data-role="content">
    <form id="task-form" method="GET">
      <div data-role="fieldcontain">
        <input type="text" name="task" id="task" />
      </div>
      <input id="add" type="button" data-icon="plus" value="Agregar" />
    </form>
    <br />
    <ul id="task_list" data-role="listview">
      <li data-role="list-divider">Pendientes</li>
    </ul>
  </div>
</div>

Confirmacion

Las opciones al ver una tarea seran marcarla como completada o no, de cualquier manera borraremos la tarea.

<div id="confirm" data-url="confirm" data-role="page">
  <div data-role="header">
    <h1>Finalizar tarea</h1>
  </div>
  <div data-role="content">
    Marcar esta tarea como
    <br>
    <a class="remove_task" href="#done" data-role="button" data-icon="delete" data-theme="f">Completada</a>
    <a class="remove_task" href="#notdone" data-role="button" data-icon="check" data-theme="g">No completada</a>
    <br>
    <br>
    <a href="#index" data-role="button" data-icon="minus">Cancelar</a>
  </div>
</div>

Completada / No completada

Segun como cerremos una tarea mostraremos una de dos paginas:

<div id="done" data-url="done" data-role="page">
  <div data-role="header">
    <h1>Tareas</h1>
  </div>
  <div data-role="content">
    Excelente!
    <br>
    <br>
    <a href="#index" data-role="button">Volver</a>
  </div>
</div>


<div id="notdone" data-url="notdone" data-role="page">
  <div data-role="header">
    <h1>Tareas</h1>
  </div>
  <div data-role="content">
    Ok...
    <br>
    <br>
    <a href="#index" data-role="button">Volver</a>
  </div>
</div>

Funcionalidad

Crear un archivo vacio: www/js/todo.js. Debemos incluirlo en index.html al final del <body>, debajo de la inclusion de index.js:

...
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript" src="js/todo.js"></script>
...

Para que sea mas ordenado, pondremos la funcionalidad dentro de un objeto.

var todo = {};

Al objeto le agregaremos un array para contener las tareas, metodos y propiedades. En javascript todos los objetos son dinamicos.

//inicializamos la lista con un array vacio
todo.list = [];

El archivo completo queda asi:

// Creamos un objeto
var todo = {};

// Creamos una propiedad "list" con un array vacio
todo.list = [];

/** Metodo para ingresar una nueva tarea */
todo.add = function(event) {
    // leer el valor del input
    var task = $('input').val();
    if (task) {
        // Agregar la tarea al final del array
        todo.list[todo.list.length] = task;
        todo.refresh_list();
        // Limpiar el input
        $('input').val('');
    }
    event.preventDefault();
};

/** Metodo para remover la tarea seleccionada */
todo.remove = function() {
    // Remover el array y actualizar lista
    todo.list.splice(todo.selected,1);
    todo.refresh_list();
};

/** Re-crear la lista desde las tareas en el array */
todo.refresh_list = function() {
    var $tasks = $('#task_list'), i;
    // Clear the existing task list
    $tasks.empty();
    if (todo.list.length) {
        // Agregar encabezado
        $tasks.append('<li data-role="list-divider">Pendientes</li>');
        for (var i=0;i<todo.list.length;i++){
            // Agregar cada tarea
            var li = '<li><a data-task-id="' + i
                    + '" href="#confirm">' + todo.list[i] + '</a></li>'
            $tasks.append(li);
        }
    }
    // actualizar el listado
    $tasks.listview('refresh');
};

// Inicializar la pagina principal
$('#index').on('pageinit', function() {
    console.log('index.pageinit');

    // Vaciamos el array al iniciar la pagina
    // esto sucede solo una vez
    todo.list = [];

    // Asignamos el metodo todo.add al click de #add
    $('#add').on('click', todo.add);

    // Delegamos el evento click que suceda a cualquier
    // <a> dentro de un <li> dentro de #task_list
    $('#task_list').on('click', 'li a', function() {
        todo.selected = $(this).data('task-id');
    });

    // Asignar el metodo todo.refresh_list al evento
    // "pagebeforeshow" para que sea llamado
    // siempre antes de mostrar #index
    $('#index').on('pagebeforeshow', todo.refresh_list);
});

// Capturamos el evento click de los botones .remove_task
// Estos son los que marcan completado/no completado
$(document).on('pageinit', '#confirm', function(){
    $('.remove_task').on('click', todo.remove);
});

Agregar tarea

/** Ingresar una nueva tarea */
todo.add = function(event) {
    // leer el valor del input
    var task = $('input').val();
    if (task) {
        // Agregar la tarea al final del array
        todo.list[todo.list.length] = task;
        todo.refresh_list();
        // Limpiar el input
        $('input').val('');
    }
    event.preventDefault();
};

Remover item

/** Remover la tarea marcada como selected */
todo.remove = function() {
    // Remover el array y actualizar lista
    todo.list.splice(todo.selected,1);
    todo.refresh_list();
};

Actualizar lista

Para actualizar la lista, primero removemos todos los elementos y los volvemos a ingresar con los valores del array (todo.list):

/** Re-crear la lista desde los valores del array */
todo.refresh_list = function() {
    var $tasks = $('#task_list'), i;
    // Clear the existing task list
    $tasks.empty();
    if (todo.list.length) {
        // Agregar encabezado
        $tasks.append('<li data-role="list-divider">Pendientes</li>');
        for (var i=0;i<todo.list.length;i++){
            // Agregar cada tarea
            var li = '<li><a data-task-id="' + i
                    + '" href="#confirm">' + todo.list[i] + '</a></li>'
            $tasks.append(li);
        }
    }
    // actualizar el listado
    $tasks.listview('refresh');
};
  1. Repaso y conceptos basicos
  2. Ejercicios para repasar
  3. Problematica de desarrollo mobile
  4. Phonegap
  5. Requerimientos e instalacion
  6. Phonegap CLI
  7. [Primeros ejercicios con Phonegap](Ejercicio Phonegap)
  8. Plugins
  9. Hello world
  10. Estructura de un proyecto Phonegap
  11. Plugin Device
  12. Debugging
  13. Incorporando un framework CSS
  14. Plugin Vibration
  15. Sumando partes
  16. Plugin Battery Status
  17. Un poco de jQuery
  18. jQuery Mobile
  19. Navegacion
  20. Plugin Dashboard
  21. Revision de Plugin Dashboard
  22. Paginas extra
  23. ToDo
  24. Persistencia
  25. ToDo Persistente
  26. Plugin Camera
  27. Opciones de camara
  28. App Mi Galeria
  29. Revision de Galeria
  30. Plugin File
  31. Escribir y leer texto
  32. Escribir archivos binarios
  33. Guardando fotos
  34. Debugger: weinre
  35. Inspeccionar con weinre
  36. Phonegap Developer App
  37. Refactor de apps
  38. Plugin Media
  39. Pruebas con audio
  40. Control y monitoreo de audio
  41. Encapsular play/pausa
  42. Hacks
  43. Formato de tiempos
  44. Grabar y reproducir
  45. Proyecto Integrador
  46. Revision de interfaz
  47. Interfaz basica
  48. Entrevista: modelo
  49. Funcionalidad: revision
  50. Seleccion de framework
  51. iRec: navegacion
  52. iRec: fileApi
  53. iRec: guias
  54. iRec: entrevistas
  55. iRec: recordApi
  56. iRec: helpers
  57. iRec: mediaApi
  58. iRec: inicializar paginas
  59. iRec: refactor
  60. iRec: mediaApi refactor
  61. iRec: recordApi refactor
  62. iRec: helpers
  63. iRec: guias.js
  64. iRec: entrevistas.js
  65. iRec: crear guias
  66. iRec: re-inicializando
  67. iRec: re-ordenando
  68. iRec: pendientes
  69. iRec: reporte ux
  70. iRec:revision: volver
  71. iRec:entrevista: volver
  72. iRec:revision: cambios
  73. iRec:revision: stop
  74. iRec:revision: Rew 10"
  75. iRec:revision: tag Go
  76. iRec: limpieza
  77. Firma de apps
  78. Android
  79. Generacion de key
  80. Firma de apk
  81. Alineacion de zip
  82. Firmar con Phonegap
  83. iOS
  84. Detalles finales
  85. Config.xml
  86. Iconos
  87. Splash
Clone this wiki locally