【问题标题】:Cast ActionScript Object to Model将 ActionScript 对象强制转换为模型
【发布时间】:2012-03-04 18:39:03
【问题描述】:

在 ActionScript 3 中是否有任何“自动方式”将“对象”转换为个性化模型数据类型?

例子:

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 上的结果为空。 有任何想法吗? 谢谢。

编辑:

根据Manish的回答,我改变的只是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];
}

感谢 Manish 和 rcdmk。 Manish 的回答对我来说已经足够了,根据 rcdmk 的评论,p:String 与循环将通过的数据类型无关,它实际上是属性的名称,它有意义,因为每个 name 都是 String。

【问题讨论】:

  • 您能告诉我们更多关于您为什么要实现这一目标的信息吗?这违背了 ActionScript 的设计原则,可能有更好的方法来实现您的目标。
  • 当用户双击数据网格上的记录时,我会自动打开一个包含该实体表单的不同状态,并用他的寄存器 (dataGridId.selectedItem) 填充所有字段。但这是一个对象,当我要为 PHP 发送它时,我“手动”将整个表单转换为个性化模型。如果我可以将表单与Model绑定,我就不再需要遍历所有字段并一一设置Model属性了。

标签: model-view-controller object actionscript casting


【解决方案1】:

自动“投射”它的唯一方法如下:

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.id 和 Model.name 都是 String 类型。)

当然,更合适的方法是将普通对象传递给Model对象,让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 子类(例如ProductModel、CustomerModel 等)都可以自动使用它。

例如

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

【讨论】:

  • 我必须承认这比手动映射每个模型要容易,但有一个问题:您只映射字符串?其他类型呢?
  • 这可以映射任何值。 for 中的字符串用于对象具有的每个属性的 property name,并将其用作方括号符号上的键来访问模型的变量。
  • @MarcoAurélioDeleu 不,它映射任何类型,而不仅仅是 String。
猜你喜欢
  • 2012-05-30
  • 2012-08-29
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多