Este es un tip sencillo pero que me dió algún que otro dolor de cabeza al querer aplicar unos efectos sobre los componentes utilizados como itemRenderes dentro de un componente tipo lista en Flex. Se trata de cómo poder acceder a estos componentes para manipular su contenido a través de Actionscript.
Para acceder al componente del itemRenderer en concreto utilizaremos indexToItemRenderer, pasándole como parámetro el index del ítem que queremos obtener.
El detalle importante que debemos tener en cuenta es que no podemos referenciar un objeto que no sea visible dentro de la zona del scroll, ya que hasta entonces devolvería valor null. Para ello deveremos realizar la comprobación con isItemVisible, y ejecutar las acciones solo sobre los componentes visibles.
Código :
var total:uint = tileList.dataProvider.length; for (var i:uint = 0; i < total; i++) { if (tileList.isItemVisible(tileList.dataProvider[i]) == true) { var item:Object = tileList.indexToItemRenderer(i); // resto de implementación sobre los componentes } }
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por BoNi el 22 de Marzo de 2009
*Anotando
Por alfathenus el 25 de Marzo de 2009
Pero no se me ocurre porque se querria acceder desde afuera a los items renderers, por lo general el itemrenderer lanza eventos q lo captura el ui.
¿Nose, en q caso tuviste q hacer la comunicacion app->itemsrederers?
Saludos!
Por luchota el 26 de Marzo de 2009
cuando queres reutilizar un item renderer, por ejemplo uno que usa una cierta función de comparación de valor, es útil tener esa función "desacoplada" del item renderer y tenerla en el que controla al item renderer.
Algo que yo suelo hacer:
- suponiendo que tu item renderer tiene la propiedad compareFunction:Function.
<code>
var cf:ClassFactory = new ClassFactory(MyRender);
cf.properties = {compareFunction:my_funcion_en_componente_padre};
var list:List = new List();
list.itemRenderer = cf;
</code>
Lo que hace el classFactory es asignarle al MyRender la propiedad compareFunction que por referencia esta en tu componente padre, y no en tu item render.
Obviamente puedes proveer un comportamiento por defecto para esa función.
Saludos!
Por alfathenus el 27 de Marzo de 2009
Si, en ese caso es util ya q estas creando el List "on the fly".
Yo me referia a querer setear datos desde afuera a un itemrenderer ya creado, tal como lo hizo el buen amigo Zguillez, sobre todo si modificando el ArrayCollection del dataprovider ya estarias modificando todos.
Por otro lado, el ejemplo q indicas no esta del todo desacoplado, ya q el item renderer queda acoplado al padre (pudiendo quedar referencias circulares o memory leaks). Si queres un desacople total deberias crear una clase Util o poner funciones a nivel de paquete. Por ej
Código :
De esta manera desacoplas totalmetne la funcionalidad (el algoritmo) de comparacion y ademas podes reutilizar este util en cualqueir lado. Ademas de esta menera tb le sacas una "responsabilidad" innecesaria al componente padre del list (oop).
Saludos!
Por pleve el 03 de Junio de 2010