我正在尝试在运行时复制flex组件。
例如,如果我有这个
mx:按钮标签=“btn”id =“btn”click =“handleClick(event)”/>
我应该能够调用一个名为DuplicateComponent()的函数,它应该返回一个与上面的按钮完全相同的UI组件,包括带有它的事件监听器。
有人可以帮我吗? 提前致谢
答案 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的副本