Ver Mensaje Individual
  #3 (permalink)  
Antiguo 20/04/2014, 04:30
Avatar de dashtrash
dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 8 meses
Puntos: 270
Respuesta: Combos Dependientes 3 niveles php ajax mysql

Lo primero que tienes que pensar, es que si tienes 3 cosas que hacen lo mismo, hay que hacer 1 solo codigo que gestione todo, y no uno por cada select.
El problema a resolver es : cómo gestionar inputs que sólo pueden inicializarse si otro(s) input(s) ya tiene(n) valor(es).
Esto ya implica que los inputs necesitan 2 métodos, un constructor y una inicialización.
La clase base "jsInput" tendría los siguientes métodos

- construct(name, node)
- initialize()
- enable()
- disable()
- setValue()
- getValue()
La clase base llama a initialize en su constructor.

La clase "DependentInput" es un mixin que sobreescribe construct e initialize, y debe añadir métodos callback a los que llamar en caso de cambio de los inputs de los que depende:

-construct(name, node, depends)
-initialize()
-onChanged(dependency)

El constructor llama ahora a disable().Solo se llama a initialize cuando se le establece un valor
con setValue(), o cuando los onChanged de todos los depends() han sido llamados, y tienen valores no nulos.

Aparte, cualquier input que necesite una fuente de datos Ajax, deberia hacer mixin de una clase que dé esa funcionalidad. Si la clase se llama, por ejemplo, AjaxDataSource, tendriamos que, para hacer 3 inputs dependientes, necesitamos una clase AjaxSelect, que deriva de JsInput y hace mixin de AjaxDataSource, y una clase DependentAjaxSelect que deriva de AjaxSelect, y hace mixin de DependentInput.

El primer select es "libre" (no tiene dependencias).Es un AjaxSelect.Los otros dos son DependentAjaxSelect que reciben en su constructor el select correspondiente como dependencia.

Hay muchas librerias js que permiten construir cómodamente clases y mixins.

Esta es una forma "correcta" de hacerlo.

La otra es hacerlo con copy-paste, que es el código que tienes.
Devolver selects html como respuesta ajax , en vez de simplemente los datos, es otra mala señal.Mezclar html con queries, es otra pésima señal.Obtener el valor del select con this.value , es incorrecto....En fin..