Pregunta

Tengo una clase de modelo Bindable (llamándolo MyModel) con dos propiedades, etiqueta y valor. El valor se actualiza con frecuencia, por lo que se marca como vinculable. Funciona bien hasta ahora, los datos se actualizan y se envía el evento de cambio de propiedad estándar.

Ahora tengo que hacer una ArrayCollection desde las instancias de objetos de este modelo para usarla como proveedor de datos en un grupo de datos. Los datos se pasan a un ItemRenderer personalizado en el que accedo a las propiedades MyModel a través de Data.Label y Data.Value.

El único problema que tengo ahora es que la propiedad MyModel Value ya no cambia (supongo porque almacené los objetos en ArrayCollection).

La ArrayCollection es marcada también vinculable por cierto, porque las nuevas instancias de objetos de MyModel se pueden agregar durante el tiempo de ejecución.

¿Hay alguna manera de hacer funcionar esto? ¡Cualquier ayuda con respecto a esto sería muy apreciada!

EDITAR: Casi olvido, el objeto de valor en la clase MyModel se actualiza por otra clase vinculable. Sí, sé que eso es una locura, pero es por eso que estoy aquí, para obtener información sobre una forma más simple (y de hecho funcionando) de resolver este problema.

Segunda edición: Allight Guys, un poco de código para ilustrar el problema;

Comencemos con la primera clase Bindable;

[Bindable]
public class FirstClass
{
   public var name:String;
   public var firstValue:Number;
   public var secondValue:Number;
   public var thirdValue:Number;

   public function FirstClass()
   { }
 }

Los valores (primero a tercero) se actualizan por una clase de controlador. Hasta aquí todo bien. Ahora a la segunda clase modelo (para asuntos de consistencia, mantengamos el nombre de MyClass)

[Bindable]
public class MyClass
{
   public var label:String;
   public var value:Number;

   public function FirstClass()
   { }
 }

Estas son las dos clases de modelo. El fondo detrás de esto es que necesito un valor de cadena (una etiqueta) para cada propiedad de una instancia de FirstClass. Me gustaría hacer esto más simple, así que realmente no estoy decidido por esta "solución" tos ;).

De todos modos, tenemos los dos modelos, ahora a mi clase .mxml;

[Bindable] private var firstClassInstance:FirstClass;

Creo una nueva ArrayCollection y agrego objetos como este; myArrayCollection.AddItem (nueva myClass ("Esta es una etiqueta", FirstClassInstance.FirstValue));

Y nuevamente, el DataGroup utiliza esta ArrayCollection como proveedor de datos.

Como ya establecimos (gracias @windowns), ArrayCollection solo parece que los objetos se agregan o eliminan, no los cambios de propiedad de estos objetos.

¿Fue útil?

Solución 4

Tomé el consejo de Amy e investigué un poco más sobre el método de itemupdated. Resulta que la solución estaba allí.

Mira aquí: http://flex4examples.wordpress.com/2009/08/28/1st/

Apliqué esta metodología (con pocas variaciones) a mi código y funciona bastante bien. El rendimiento en el iPad2 es bueno y también lo es el uso de memoria de mi componente.

Esperemos que Amy esté bien con esta solución también. Dedos cruzados. ;)

Otros consejos

Llame a elemento superpuesto en su ArrayCollection cuando actualice una "pieza" de un elemento almacenado en él.

Podría haber muchos problemas con la vinculación. Publique el código para ayudarnos a ver lo que está sucediendo. Aquí hay algunas cosas de "alto nivel" a tener en cuenta que eso podría responder a su pregunta.

Cuando se usa una ArrayCollection de objetos vinculables, es importante tener en cuenta que el enlace para la ArrayCollection solo mira cada instancia de objeto y si se agrega o elimina de la colección. No sabrá sobre ningún cambio de propiedad que se produzca a su objeto. Comúnmente, cuando usa un ItemRenderer, las propiedades están obligadas a mostrar elementos. Como tal vez la propiedad "Valor" vinculada a una etiqueta en el itemrenderer. Ahora, cuando su instancia de objeto (myModel) cambia su propiedad de "valor", la etiqueta debe recogerla. También tenga en cuenta que debe marcar cualquier propiedad que tenga la intención de unirse a elementos visuales con la meta-etiqueta [vinculable].

public class myModel
{
    [Bindable]
    public var label:String;
    [Bindable]
    public var value:String; 

    public function myModel() {}
}

Respuesta después de la publicación del código:

Cuando haces lo siguiente:

myArrayCollection.addItem(new MyClass("This is a label", firstClassInstance.firstValue));

Está tomando el valor de FirstClassInstance. Entonces, si haces lo siguiente:

myArrayCollection.getItemAt(addedClassIndex).value = 5;

No hará que se anoten ningún cambio en FirstClassInstance. Solo estamos trabajando con el tipo básico de número que nunca se pasa por referencia, como todos los demás objetos están en flexión.

Quizás probar esto:

[Bindable]
public class MyClass
{
    public var label:String;

    [Bindable]   //might be redundant due to global [Bindable] flag, been a while since i've used a global one
    public function get value():Number{
        return m_objRef.firstValue;
    }
    public function set value(value:Number):void{
        m_objRef.firstValue = value;
    }

    private var m_objRef:FirstClass;

    public function MyClass(_label:String, _valueObj:FirstClass) {
        m_objRef = _valueObj;
        label = _label;
    }
}

Los chicos totales (y chicas;)) Después de dos horas de jugar con Bindingutils, finalmente encontré la solución a mi problema. Las dos clases de modelo pueden seguir siendo como son, por lo que no es necesaria pasar la instancia de FirstClass. Simplemente vinculando las propiedades de valor de FirstClass al campo de valor de MyClass funciona como se esperaba y los valores en ArrayCollection también se actualizan.

Entonces la solución;

myClassObject = new MyClass();
myClassObject.label = "This is a label";
BindingUtils.bindProperty(myClassObject, "value", firstClassObject, "firstValue");

Y luego simplemente agregue el myClassObject al ArrayCollection.

Tenga en cuenta que todo el código aquí es pseudo código, así que no importa ningún tipo de errores tipográficos.

Aún así, @windowns sugiriendo pasar el objeto FirstClass a MyClass se incorporará a mi solución final, ya que hace que cambiar entre propiedades sea mucho más fácil (FirstClass tiene muchos de ellos, no solo los 4 en mi primera publicación). ¡Muchas gracias por eso!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top