thegameofcode / iris

Iris JavaScript
BSD 3-Clause "New" or "Revised" License
28 stars 13 forks source link

Problema con la barra de direcciones #73

Closed surtich closed 11 years ago

surtich commented 11 years ago

Puede que un usuario quiera navegar escribiendo en la barra de direcciones.la URL del Screen.

SI se equivoca, Iris informa correctamente de que:

The path[#/bas_hash] hasn't associated screen, use self.screens to register the screen first

Pero si después y escribe la dirección correcta, en vez de ir al Screen, Iris dice:

Cannot call method 'canSleep' of undefined

ghost commented 11 years ago

Es bastante complicado evitar esto,... lo dejamos apuntado para la próxima versión

ghost commented 11 years ago

En la próxima versión no se lanza una excepción, se pinta un mensaje en la consola y además se lanza el evento iris.SCREEN_NOT_FOUND, porque lo habitual va a ser que se capture este evento para redirigir al usuario a una página de error (#/404) y no dejar todo "roto" como ocurría hasta ahora.

He estado revisando el código de navegación y realmente es difícil solucionar el problema que comentas.

Si inicias el proyecto para tests (grunt test) y visitas: http://localhost:8080/examples/basic/index.html#/instance cambias la url por: http://localhost:8080/examples/basic/index.html#/instance666 y vuelves a poner: http://localhost:8080/examples/basic/index.html#/instance

Se pierde la pantalla que estabas viendo y parece que no hace nada. Esto es así porque se ejecuta el sleep de #/instance y la deja oculta. Como el proceso de navegación se detiene cuando se descubre que #/instance666 no existe, al volver a escribir #/instance, para iris es su ultima pagina visitada y no hace nada. Con lo del evento que te comentaba este problema no existiría porque se le redireccionará al usuario a otra pagina distinta y al volver a escribir #/instance volverá a acceder sin problema.

Por como esta diseñado todo esto es muy difícil mantener el orden que establecimos de hacer primero sleep, luego creates y awakes, porque necesariamente tenemos que hacer hide de las screens del anterior hash antes de empezar a crear e instanciar las nuevas screens porque las screens no se registran hasta que no se ejecuta el create de la pantalla.

El único "apaño" que medio soluciona el problema es hacer algo como: Añadir las screens dormidas a un array:

sleepingScreens.push(screenToSleep);

Cuando detectemos que una nueva screen no existe:

 for ( i = 0; i < sleepingScreens.length; i++ ) {
         sleepingScreens[i].show();
         sleepingScreens[i]._awake();
}

Esto no me llega a gustar porque hace que las screens se duerman y vuelvan a despertarse inmediatamente después, por lo que se llamarían a los self.sleep() y self.awake() de todas las pantallas y sus componentes, haciendo que se ejecuten todas las posibles cosas que se hagan en cada uno y además si el usuario tenía intención de redirigir al usuario a una página de error todo esto no serviría para nada y le podría resultar confuso entender porque hay cosas que se durmieron y luego se volvieron a despertar.

Si se te ocurre una solución sencilla (si es algo costoso de implementar o muy ineficiente no merece la pena), que mantenga la retrocompatibilidad, dímelo y la reabrimos. Pero yo creo que con el nuevo evento nadie va a quejarse por este caso en particular.