ToDo app - CGastrell/phonegap GitHub Wiki
Una aplicacion simple de tareas
Crear un proyecto nuevo, basandose en templates\jqm
:
phonegap create prueba8 --id com.coderhouse.prueba8 --name "00 Prueba 8" -src templates\jqm
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:
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>
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>
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>
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');
};