【发布时间】:2009-07-06 10:53:33
【问题描述】:
我试图在运行时复制一个弹性组件。
例如,如果我有这个
mx:Button label="btn" id="btn" click="handleClick(event)"/>
我应该能够调用一个名为 DuplicateComponent() 的函数,它应该返回一个 UI 组件,它与上面的按钮完全相同,包括事件侦听器。
有人可以帮帮我吗? 提前致谢
【问题讨论】:
标签: apache-flex adobe copy air
我试图在运行时复制一个弹性组件。
例如,如果我有这个
mx:Button label="btn" id="btn" click="handleClick(event)"/>
我应该能够调用一个名为 DuplicateComponent() 的函数,它应该返回一个 UI 组件,它与上面的按钮完全相同,包括事件侦听器。
有人可以帮帮我吗? 提前致谢
【问题讨论】:
标签: apache-flex adobe copy air
进行字节数组复制。此代码段应该为您完成:
// 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 列表上的帖子中得到的。
【讨论】:
要解决这个问题,您应该使用 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 个按钮。
【讨论】:
您不能在本地获取 UIComponents 的深层副本。最好的办法是创建一个新的并分析您必须添加重复设置的那个。老实说,这听起来确实有点代码味道。我想知道是否有更好的解决方案来重新思考这个问题..
【讨论】:
同样的问题:http://www.flexforum.org/viewtopic.php?f=4&t=1421
出现在谷歌搜索相同的东西。因此,您在一个月后剪切并粘贴了相同的问题。没有运气吧?
据我所知,没有简单的方法可以做到这一点。许多组件的设置都依赖于容器/上下文/等...并在创建过程中被实例化,因此没有理由从这个角度进行克隆。
您可以在 actionscript 中克隆关键设置并在创建新元素时使用这些设置。
例如,假设您只关心属性,您可能有一个数组 ["styleName","width","height",...],您可以像这样使用该数组:
var newUI:UIComponent = new UIComponent();
for each(var s:String in propArray) {
newUI[s] = clonedUI[s];
}
如果您希望对您的问题有更多了解(而不是等待一个月),请告诉我们您想要实现的目标。
【讨论】:
mx.utils.ObjectUtil 经常派上用场,但是对于复杂的对象类型,实现一个需要 .clone() 方法的接口通常是一种很好的做法,类似于克隆事件的方式。
例如:
class MyClass implements ICanvasObject
{
...
public function clone():ICanvasObject
{
var obj:MyClass = new MyClass(parameters...);
return obj;
}
}
这使您的代码更加清晰,并在如何使用/克隆对象的上下文中正确封装了关注点。
【讨论】:
您是对的,但根据我的理解 UI 组件不是由 mx.utils.ObjectUtil 克隆的。
来自:http://livedocs.adobe.com/flex/201/langref/mx/utils/ObjectUtil.html#copy()
copy() 方法
公共静态函数副本(值:对象):对象 复制指定的 Object 并返回对副本的引用。该副本是使用本机序列化技术制作的。这意味着在复制期间将尊重自定义序列化。
此方法设计用于复制数据对象,例如集合的元素。它不适用于复制 UIComponent 对象,例如 TextInput 控件。如果要创建特定 UIComponent 对象的副本,可以创建组件的子类并实现 clone() 方法或其他方法来执行复制。
参数 value:Object — 应复制的对象。
返回 Object — 指定对象的副本
【讨论】: