2012-03-04 1 views
2

Existe-t-il une "méthode automatique" pour transformer un "objet" en un type de données de modèle personnalisé dans ActionScript 3?Transmettre l'objet ActionScript au modèle

Exemple:

package Example{ 
    public class ExampleModel{ 
     private _id:int; 
     private _randomAttribute:String; 

     public function ExampleModel(){ 
      _id = 0; 
      _randomAttribute = ""; 
     } 

     public function get id():int{ 
      return _id; 
     } 

     public function set id(value:int):void{ 
      _id = value; 
     } 

     public function get randomAttribute():String{ 
      return _randomAttribute; 
     } 

     public function set randomAttribute(value:String):void{ 
      _randomAttribute = value; 
     } 
    } 
} 

Ensuite,, laisse supposer dans une partie de mon code que j'ai quelque chose comme ceci:

var _obj:Object = new Object(); 
_obj.id = 1; 
obj.randomAttribute = "Hello World"; 

Ce que je veux serait quelque chose comme:

var _exampleModel:ExampleModel = obj as ExampleModel; 

Mais quand je fais cela, le résultat sur _exampleModel est nul. Des idées? Merci.

EDIT:

Selon la réponse de Manish, tout ce que je changé était le type de p var, ce qui me permet de passer par toutes sortes d'attributs:

public function fromObject(obj:Object):void{ 
    //p:* includes every type of attributes. 
    for (var p:* in obj) 
     if (this.hasOwnProperty(p)) 
      // Set private var directly. 
      this["_" + p] = obj[p]; 
} 

Merci Manish et rcdmk. La réponse de Manish était suffisante pour moi et selon rcdmk le commentaire, le p: String ne concerne pas le type de données que la boucle va traverser, c'est en fait le nom de la propriété, ce qui est logique car chaque nom est un Chaîne.

+0

Pouvez-vous nous en dire plus sur les raisons pour lesquelles vous essayez d'atteindre cet objectif? Cela va à l'encontre de la conception d'ActionScript, et il y a probablement un meilleur moyen d'atteindre vos objectifs. –

+0

Lorsqu'un utilisateur double-clique sur un enregistrement sur un dataGrid, j'ouvre automatiquement un état différent qui contient le formulaire pour cette entité et remplit tous les champs avec son registre (dataGridId.selectedItem).Mais c'est un objet et quand je vais l'envoyer pour PHP, je "cast" manuellement le formulaire entier à un modèle personnalisé. Si je peux lier le formulaire avec le Modèle, je n'ai plus besoin de parcourir tous les champs et de définir l'attribut Modèle un par un. –

Répondre

3

La seule façon de automatiquement "cast" est la suivante:

var model:Model = new Model(); 
var obj:Object = { id: "98123", name: "John Doe" }; 

for (var p:String in obj) { 
    if (model.hasOwnProperty(p)) 
     model[p] = obj[p]; 
} 

(Note:. Model.id et Model.name sont les deux types String dans mon exemple)

Une façon plus appropriée de le faire , bien sûr, est de passer l'objet brut à l'objet Model et laissez l'objet Model l'absorber.

var model:Model = new Model(obj); 

Ou:

var model:Model = new Model(); 
model.fromObject(obj); 

Où dans le code Model vous avez:

public function Model(obj:Object = null) 
{ 
    if (obj != null) 
     fromObject(obj); 
} 

public function fromObject(obj:Object):void 
{ 
    for (var p:String in obj) 
     if (this.hasOwnProperty(p)) 
      // Set private var directly. 
      this["_" + p] = obj[p]; 
} 

Ce code peut être dans votre classe de base Model abstraite, et tous vos Model spécifiques des sous-classes (par exemple ProductModel, CustomerModel, etc.) peut l'utiliser automatiquement.

par exemple.

public class ProductModel extends Model 
{ 
    public function ProductModel(obj:Object = null) 
    { 
     super(obj); 
    } 
} 
+0

Je dois admettre que cela est plus facile que de mapper manuellement chaque modèle, mais une question: Vous mappez uniquement les chaînes? Qu'en est-il des autres types? –

+1

Ceci peut affecter n'importe quelle valeur. La chaîne dans le 'for' est pour le' nom de la propriété' de chaque propriété de l'objet et l'utilise comme une clé sur la notation des braquets carrés pour accéder aux variables du modèle. – rcdmk

+1

@ MarcoAurélioDeleu Non, il mappe tout type, pas seulement 'String'. – Manish

Questions connexes