2012-03-04 14 views
2

「オブジェクト」をActionScript 3のパーソナライズドモデルデータ型にキャストする「自動方法」はありますか?ActionScriptオブジェクトをモデルにキャスト

例:

var _exampleModel:ExampleModel = obj as ExampleModel; 
:私は何をしたいことのようになり

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

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

その後、私のコードの一部では、私はこのような何かを持っていることを前提としています

これを行うと、_exampleModelの結果はnullになります。 アイデアおかげさまで

EDIT:

マニッシュの答えによると、私が変更されたすべての私は、属性のすべての種類を通過することを可能にするのp VARの種類、だった:

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

おかげマニッシュおよびrcdmk。 Manishの答えは私にとっては十分で、rcdmkのコメントでは、p:Stringはループが通過するデータの種類に関するものではなく、実際にはプロパティの名前です。 の名称は、文字列です。

+0

なぜこれを達成しようとしているのですか?これは、ActionScriptのデザインのグレインに反するもので、おそらくあなたの目標を達成するためのより良い方法があります。 –

+0

ユーザーがdataGridのレコードをダブルクリックすると、そのエンティティのフォームを含む別の状態が自動的に開き、すべてのフィールドにそのレジスタ(dataGridId.selectedItem)が設定されます。しかし、これはオブジェクトであり、これをPHPに送信するときは、フォーム全体をパーソナライズドモデルに「手動で」キャストします。モデルをフォームにバインドすることができれば、すべてのフィールドを1つずつモデル属性を設定する必要はありません。 –

答えて

3

自動的に追従している「キャスト」する唯一の方法:

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

(注:Model.idModel.nameは、私の例では、両方のタイプStringある)

それを行うには、より適切な方法もちろん、普通のオブジェクトをModelオブジェクトに渡し、Modelオブジェクトにそれを吸収させることです。

var model:Model = new Model(obj); 

または:

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

このコードは、あなたの抽象基本Modelクラスであること、そしてすべてのあなたの特定のModelのサブクラス(例えばすることができます:あなたが持っているModelコードで

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

ProductModelCustomerModelなど)は自動的に使用できます。

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

これは、すべてのモデルを手動でマッピングするよりも簡単ですが、1つの質問:文字列のみをマッピングしていますか?他のタイプはどうですか? –

+1

これは任意の値をマップできます。 'for'の文字列は、オブジェクトが持っている各プロパティの'プロパティ名 'のためのもので、モデルの変数にアクセスするために四角いbraquets表記のキーとして使用します。 – rcdmk

+1

@MarcoAurélioDeleuいいえ、 'String'だけでなく、どんなタイプでもマッピングします。 – Manish

関連する問題