IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

Copie d'objets et perte de databing


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de MigsFR
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut Copie d'objets et perte de databing
    Bonjour,

    Je dispose d'un model de données de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    User -> name
         -> firstname
         -> address -> street
                    -> postcode
                    -> city
    Les différentes propriétés de cet objet User sont bindées aux champs d'un formulaire. Mon problème c'est que je voudrais remplacer l'instance de cet objet par une autre sans perdre le binding. Par exemple:

    Et je voudrais qu'en faisant ça, les propriétés de mon user2 se retrouvent bindées au formulaire sans que je doive recoder tout le databinding de chaque champ.

    En faisant ça j'écrase la valeur de bindedUser et je la remplace par l'instance de user2, du coup mon objet bindedUser change de référence (d'adresse mémoire) pour prendre la référence de user2 et l'ancienne référence est perdue alors que c'est elle qui est référencée dans le binding et c'est donc logique que perde le binding aussi.

    J'avais donc comme idée de faire une copie par valeur et non pas par référence comme c'est possible en C++ mais je ne sais pas si as3 le permet. Si je pouvais définir bindedUser comme pointeur alors je pourais binder le pointeur au lieu de binder l'instance de l'objet.

    Sinon l'autre alternative c'est de copier chaque propriété du deuxième objet dans le premier objet mais je n'aime pas cette solution car je souhaite faire une méthode de copie générique qui fonctionne pour tout type d'objets. Il faudrait alors que je passe par l'introspection, que j'explore les propriétés des objets et que je les copie. Oui mais!... Mes propriétés peuvent elles même être des objets (comme l'adresse dans cet exemple). Et donc il faudra explorer plusieurs niveaux du model de données, prendre en compte les références circulaires pour éviter les boucles infinie etc... Bref la galère... Donc si la copie par valeur pouvait fonctionner ça serait l'idéal.

    Une idée?

  2. #2
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    bonjour,

    pour faire une copie par valeur (clone) d'un objet, il faut que ton objet implémente flash.utils.IExternalizable et que tu redéfinisses readExternal() et writeExternal().

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    public class A implements IExternalizable
    {
       private var _prop:int;
     
       public function get prop():int
       {
    	return _prop;
       }
     
       public function set prop(value:int):void
       {
          _prop = value;
       }
     
       public function readExternal(input:IDataInput):void
       {
            // Ici toutes tes propriété DANS L'ORDRE d'insertion de writeExternal
    	prop = input.readInt();
       }
     
       public function writeExternal(output:IDataOutput):void
       {
    	output.writeInt(prop);
       }
     
       public function clone():A
       {			
    	var ba:ByteArray = new ByteArray();
    	ba.writeObject(this);
    	ba.position = 0;
    	return ba.readObject() as A;
       }
     
    }
    Ainsi, un simple code comme celui ci te duplique ton objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var a1:A = new A();
    a1.prop = 10;
     
    var a2:A = a1.clone();
    A noter que dans ton cas de figure ou la propriété address semble être une classe, tu devras à nouveau implémenter writeExternal() et readExternal() dedans pour y écrire street, postcode et city.

    A+

  3. #3
    Membre averti Avatar de MigsFR
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Merci Madfrix pour ta réponse, je ne connaissais pas cette interface.

    Je vais tester tout ça et je te dirais si ça a fonctionné

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    J'ai oublié de te dire d'ajouter cela dans ton constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    registerClassAlias("ton.package.TaClasse", TaClasse);

  5. #5
    Membre averti Avatar de MigsFR
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Ok alors j'ai pu tester cette solution.

    Par contre ça ne me donne pas le résultat attendu mais c'est peut être parce que je me suis mal fait comprendre quant à mon besoin initial.

    Ce que voudrait c'est que lorsque je fais: bindedUser = user2; les propriétés de user2 soient copiés dans bindedUser sans que la référence de bindedUser ne change. Les objets seront identiques en tout point sauf qu'il gardent chacun leur adresse mémoire.

    Ta solution fais bien une copie valeur dans le sens ou bindedUser n'a pas la même adresse que user2 après l'affectation, par contre l'adresse de bindedUser change tout de même pour prendre celle d'une nouvelle instance de User qui est un clone de user2. Du coup ça me casse mon binding de la même manière puisque l'ancienne instance référencée par bindedUser est perdue.

    D'autre part je ne comprends pas en quoi ta solution est différente d'un simple : ObjectUtil.copy(user2); ou d'un ObjectUtil.clone(user2);.

  6. #6
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par MigsFR Voir le message
    D'autre part je ne comprends pas en quoi ta solution est différente d'un simple : ObjectUtil.copy(user2); ou d'un ObjectUtil.clone(user2);.
    Cette méthode ne fonctionne que pour les types primitifs, pas personnalisés.

    Pour ton problème à mon avis, pas d'autre solution que de modifier les propriété de ton objet user1 en fonction de user2 et vu que l'introspection as3 est très pauvre, tu ne peux pas facilement mettre en place une fonction générique désolé...

Discussions similaires

  1. [FLASH 8] Copy d'objets
    Par bibile dans le forum Flash
    Réponses: 3
    Dernier message: 13/09/2006, 17h18
  2. [POO] sauvegarde d'objets et perte des methodes
    Par Matth_S dans le forum Langage
    Réponses: 3
    Dernier message: 23/12/2005, 15h47
  3. Méthode de classe et copie d'objets
    Par Duloup dans le forum Général Python
    Réponses: 5
    Dernier message: 11/04/2005, 16h27
  4. [VB6] Copie d'objet
    Par preverse dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 23/08/2004, 10h04
  5. [VB6] Copie d'objets
    Par austin49 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/05/2003, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo