¿Quieres registrarte?

Acceder a los itemRenderer de un componente lista en Flex

Por: Zguillez
22 de Marzo del 2009

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
   }
}

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas flex actionscript_3 componente

Comentarios | Enviar un comentario
Un tip muy útil Z ^^
Por: XKlibur
Realmente interesante, gracias Z!
Por: BoNi
de puta madre!!! :D
Por: gersonm
Excelente (y)
*Anotando
Por: Otaku RzO
Interesante propiedad :)

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: alfathenus
Estimado alfathenus.
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: luchota-blog
hola luchota

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 :

package com.utils
{
     public function compareFunction():void {}
}

var cf:ClassFactory = new ClassFactory(MyRender);
cf.properties = {compareFunction:com.utils.compareFunction};
var list:List = new List();
list.itemRenderer = cf;

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: alfathenus
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.