克隆flex组件

时间:2009-07-06 10:53:33

标签: flex adobe copy air

我正在尝试在运行时复制flex组件。

例如,如果我有这个

mx:按钮标签=“btn”id =“btn”click =“handleClick(event)”/>

我应该能够调用一个名为DuplicateComponent()的函数,它应该返回一个与上面的按钮完全相同的UI组件,包括带有它的事件监听器。

有人可以帮我吗? 提前致谢

6 个答案:

答案 0 :(得分:5)

执行字节数组复制。这段代码应该为您完成:

// ActionScript file
import flash.utils.ByteArray;

private function clone(source:Object):*
{
    var myBA:ByteArray = new ByteArray();
    myBA.writeObject(source);
    myBA.position = 0;
    return(myBA.readObject());
}

一个注意事项,我自己没有写这个代码,我很确定我是从Flex Coder列表中的帖子中得到的。

答案 1 :(得分:1)

要解决该问题,您应该使用actionscript并动态创建按钮。

假设您希望按钮位于名为“someVbox”的VBox中

for (var i:uint = 0; i< 10; i++){
    var but:Button = new Button();
    but.label = 'some_id_'+i;
    but.id = 'some_id_'+i;
    but.addEventListener(MouseEvent.CLICK, 'handleClick');
    someVbox.addChild(but);
}

我还没有对它进行测试,但是应该在运行时为vbox添加10个按钮。

答案 2 :(得分:0)

您无法本机地获取UIComponents的深层副本。您最好的选择是创建一个新的并分析您添加重复设置的那个。说实话,这听起来像是一点代码味道。我想知道是否可以通过一些重新思考来解决问题。

答案 3 :(得分:0)

同样的问题:http://www.flexforum.org/viewtopic.php?f=4&t=1421

在谷歌搜索中出现同样的事情。所以你在一个月后剪掉并粘贴了同样的问题。没有运气呃?

我知道没有简单的方法可以做到这一点。许多组件的设置依赖于容器/上下文/等...并在创建过程中进行实例化,因此没有理由从该角度进行克隆。

您可以在动作脚本中克隆关键设置,并在创建新元素时使用它们。

例如,假设您只关心属性,您可能有一个数组[“styleName”,“width”,“height”,...],您可以像这样使用数组:

var newUI:UIComponent = new UIComponent();
for each(var s:String in propArray) {
   newUI[s] = clonedUI[s];
}

如果你想要更多的问题(而不是等待一个月),请告诉我们你想要达到的目标。

答案 4 :(得分:0)

mx.utils.ObjectUtil经常派上用场,但是对于复杂的对象类型,通常很好的做法是实现一个需要.clone()方法的接口,类似于克隆事件的方式。

例如:

class MyClass implements ICanvasObject
{
    ...

    public function clone():ICanvasObject
    {
         var obj:MyClass = new MyClass(parameters...);
         return obj;
    }
}

这使您的代码更加清晰,并在关于如何使用/克隆对象的上下文中正确地封装了关注点。

答案 5 :(得分:0)

你说得对,但根据我的理解,UI组件不会被mx.utils.ObjectUtil克隆。

来自:http://livedocs.adobe.com/flex/201/langref/mx/utils/ObjectUtil.html#copy()

copy()方法

public static function copy(value:Object):Object 复制指定的Object并返回对副本的引用。使用本机序列化技术进行复制。这意味着在复制期间将遵循自定义序列化。

此方法用于复制数据对象,例如集合的元素。它不用于复制UIComponent对象,例如TextInput控件。如果要创建特定UIComponent对象的副本,可以创建组件的子类并实现clone()方法或其他方法来执行复制。

参数value:Object - 应复制的对象。

返回Object - 指定Object的副本