Question

J'ai une classe de modèle pouvant être liée (appelons-la myModel) avec deux propriétés, étiquette et valeur. La valeur est mise à jour fréquemment, elle est donc marquée comme pouvant être liée. Fonctionne très bien jusqu'à présent, les données sont mises à jour et l'événement de changement de propriété standard est envoyé.

Je dois maintenant créer un ArrayCollection à partir des instances d'objet de ce modèle pour l'utiliser comme fournisseur de données dans un groupe de données. Les données sont ensuite transmises à un itemRenderer personnalisé dans lequel j'accède aux propriétés myModel via data.label et data.value.

Le seul problème que j'ai maintenant est que la propriété de valeur myModel ne change plus (je suppose parce que j'ai stocké les objets dans ArrayCollection).

L'ArrayCollection est également marqué comme pouvant être lié, car de nouvelles instances d'objet de myModel peuvent être ajoutées pendant l'exécution.

Y a-t-il un moyen de faire en sorte que cela fonctionne? Toute aide à ce sujet serait très appréciée!

Edit: j'ai presque oublié, l'objet value de la classe myModel est mis à jour par une autre classe pouvant être liée. Oui, je sais que c'est dingue, mais c'est pourquoi je suis ici, pour obtenir des informations sur un moyen plus simple (et en fait efficace) de résoudre ce problème.

2ème édition: Très bien les gars, un peu de code pour illustrer le problème;

Commençons par la première classe pouvant être liée;

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

   public function FirstClass()
   { }
 }

Les valeurs (du premier au troisième) sont mises à jour par une classe de contrôleur. Jusqu'ici tout va bien. Passons maintenant à la deuxième classe de modèle (pour des questions de cohérence, gardons le nom MyClass)

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

   public function FirstClass()
   { }
 }

Ce sont les deux classes modèles. Le contexte derrière cela est que j'ai besoin d'une valeur de chaîne (une étiquette) pour chaque propriété d'une instance de FirstClass. Je voudrais rendre cela plus simple, donc je ne suis vraiment pas réglé sur cette "solution" toux ;).

Quoi qu'il en soit, nous avons les deux modèles, maintenant dans ma classe .mxml;

[Bindable] private var firstClassInstance:FirstClass;

Je crée une nouvelle ArrayCollection et ajoute des objets comme celui-ci; myArrayCollection.addItem (new MyClass ("Ceci est une étiquette", firstClassInstance.firstValue));

Et encore une fois, le DataGroup utilise ce ArrayCollection comme fournisseur de données.

Comme nous l'avons déjà établi (merci @Windowns), ArrayCollection ne recherche que les objets ajoutés ou supprimés, pas les modifications de propriété de ces objets.

Était-ce utile?

La solution 4

J'ai suivi les conseils d'Amy et j'ai recherché un peu plus loin la méthode itemUpdated.Il s'avère que la solution était là.

Voir ici: http://flex4examples.wordpress.com/2009/08/28 / 1er /

J'ai appliqué cette méthodologie (avec de petites variations) à mon code et cela fonctionne plutôt bien.Les performances sur l'iPad2 sont bonnes, tout comme l'utilisation de la mémoire de mon composant.

Espérons qu'Amy accepte également cette solution.Doigts croisés.;)

Autres conseils

Appelez itemUpdated sur votre ArrayCollection lorsque vous mettez à jour un "morceau" d'un élément qui y est stocké.

Il peut y avoir de nombreux problèmes de liaison. Veuillez poster un code pour nous aider à voir ce qui se passe. Voici quelques éléments de "haut niveau" à surveiller qui pourraient répondre à votre question

Lorsque vous utilisez une collection d'objets pouvant être liée, il est important de noter que la liaison pour la collection de tableaux ne regarde que chaque instance d'objet et si elle est ajoutée ou supprimée de la collection. Il ne connaîtra aucune modification de propriété survenant sur votre objet. Généralement, lorsque vous utilisez un rendu d'élément, les propriétés sont liées aux éléments d'affichage. Comme peut-être la propriété "value" liée à une étiquette dans le moteur de rendu d'élément. Désormais, lorsque votre instance d'objet (myModel) change sa propriété "value", l'étiquette doit la récupérer. Notez également que vous devez marquer toutes les propriétés que vous avez l'intention de lier à des éléments visuels avec la balise méta [Bindable].

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

    public function myModel() {}
}

Réponse après le message de code:

Lorsque vous effectuez les opérations suivantes:

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

Vous prenez la valeur de firstClassInstance.firstValue et la fournissez comme une valeur ferme (comme si vous ne passiez pas de valeur par référence). Donc, si vous procédez comme suit:

myArrayCollection.getItemAt(addedClassIndex).value = 5;

Aucune modification ne sera notée dans firstClassInstance.firstValue car aucune "information de référence" n'est stockée. Nous travaillons uniquement avec le type de base Number qui n'est jamais passé par référence comme tous les autres objets le sont dans Flex.

Essayez peut-être ceci:

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

Très bien les gars (et les filles;)) après deux heures à déconner avec BindingUtils, j'ai enfin trouvé la solution à mon problème. Les deux classes de modèle peuvent rester telles qu'elles sont, il n'est donc pas nécessaire de transmettre l'instance de FirstClass. Lier simplement les propriétés de valeur de FirstClass au champ de valeur de MyClass fonctionne comme prévu et les valeurs de ArrayCollection sont également mises à jour.

Donc la solution;

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

Et puis ajoutez simplement myClassObject à ArrayCollection.

Gardez à l'esprit que tout le code ici est du pseudo-code, alors ne faites pas attention aux fautes de frappe.

Néanmoins, @Windowns suggérant de passer l'objet FirstClass à MyClass sera incorporé dans ma solution finale car cela facilite beaucoup le basculement entre les propriétés (FirstClass en a beaucoup, pas seulement les 4 dans mon premier message).Merci beaucoup!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top