2012-03-04 80 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