例如,我有两个ArrayCollection - firstAC和secondAC。如果我做secondAC = firstAC,而不是我对secondAC进行了更改(或许在它上面放了一个过滤器函数)它以某种方式传播到firstAC,有人会告诉我为什么会在Flex或Actionscript 3中发生这种情况吗?
如果我只想让secondAC从firstAC获取所有数据但是当我对secondAC进行更改时它不会在firstAC中显示,我该怎么办?
Thanxs一堆寻求答案! 拉吉斯拉夫
答案 0 :(得分:5)
当您编写secondAC = firstAC时,您只需声明secondAC和firstAC是对同一数组集合的引用。
你想要的是克隆第一个集合(如同,逐个复制所有元素)。
你应该能够做到这样的事情:
secondAC = new ArrayCollection();
secondAC.addAll(firstAC);
答案 1 :(得分:1)
我不知道Flex或Actionscript,但看起来firstAC和secondAC指向同一个数组,因此是预期的。
你应该做的只是创建另一个数组,复制成员,它们将是两个真正不同的实体。
答案 2 :(得分:1)
您可以尝试secondAC = firstAC
。
secondAC.addAll(firstAC)
答案 3 :(得分:0)
在ECMAScript语言(AS1-3,JavaScript等)中,当您使用
时var foo = //some value which is not a String or a Number
你真正说的是“foo现在指向与其他变量相同的对象。”这意味着在这种情况下,两个数组都将是相同的值:
var foo:Array = [ 1, 2, 3 ];
foo = bar;
bar.push( 4 );
trace( foo ); // 1, 2, 3, 4
这也适用于功能:
var foo:Array = [ 1, 2, 3 ];
adder( foo );
function adder( bar:Array ):void {
bar.push( 4 );
}
trace( foo ); // 1, 2, 3, 4
它甚至适用于XML:
var xml:XML = <root><foo/></root>;
var bar:XML = xml;
bar.children()[ 0 ].@bar = 1;
trace( xml.toXMLString() ); // <root><foo bar="1"/></root>
这称为“通过引用传递”而不是“通过值传递”或“通过复制传递”。这意味着每次引用一个项目时,每个变量都将指向同一个对象。
有很多方法可以解决这个问题,而且大多数方法都取决于你的背景。对于数组,我最喜欢的是Array.concat(),它返回数组的文字克隆。这意味着我对返回值所做的任何操作都不会以任何方式影响原件。但是,如果我正在处理XML,我会做类似的事情:var xml2:XML = XML( xml.toXMLString() );
。
在您的情况下,我实际上建议您使用:
var secondAC:ArrayCollection = new ArrayCollection( firstAC.source.concat() );
这样做的主要好处是不仅速度更快(它依赖于编译代码而不是Flex SDK代码,它也不首先实例化一个新数组,然后重新填充它),但它也有明显的好处在早期版本的Flex 3 SDK中可用 - 它完全向后兼容。