2012-03-04 78 views
2

是否有任何「自動方式」在ActionScript 3中將「對象」轉換爲個性化模型數據類型?將ActionScript對象轉換爲模型

例子:

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

然後,在我的代碼中的一些部分,讓我們假設我有這樣的事情:

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

我想要什麼會是這樣的:

var _exampleModel:ExampleModel = obj as ExampleModel; 

但是當我這樣做時,_exampleModel上的結果是null。 任何想法? 謝謝。

編輯:

根據馬尼什的回答,都讓我改變的是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的設計理念,可能有更好的方法來實現你的目標。 – 2012-03-04 19:42:59

+0

當用戶雙擊dataGrid上的記錄時,我會自動打開一個包含該實體表單的不同狀態,並用他的註冊表(dataGridId.selectedItem)填充所有字段。但是這是一個對象,當我要發送這個PHP時,我「手動」將整個表單轉換爲個性化模型。如果我可以用模型綁定表單,則不再需要遍歷所有字段並逐個設置Model屬性。 – 2012-03-04 21:05:24

回答

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物體,並讓物體吸收它。

var model:Model = new Model(obj); 

或者:

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

凡在Model代碼,您有:

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子類(如ProductModelCustomerModel等)可以自動使用它。

例如

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

我得承認,這比手工繪製每個模型更容易,但有一個問題:你只映射字符串?其他類型呢? – 2012-03-04 20:56:17

+1

這可以映射任何值。 'for'中的字符串是對象所擁有的每個屬性的'屬性名稱',並將其用作方形布拉克符號上的鍵來訪問模型的變量。 – rcdmk 2012-03-04 21:06:36

+1

@MarcoAurélioDeleu不,它映射任何類型,不只是'String'。 – Manish 2012-03-04 21:16:03