2009-12-08 59 views
1

例如,我有兩個ArrayCollection - firstAC和secondAC。如果我做第二個AC = firstAC,並且比第二個AC更改(可能會在其上放置一個過濾器函數),它會以某種方式傳播到第一個AC,任何人都會告訴我爲什麼會發生在Flex或Actionscript 3中?對一個變量的更改傳播到另一個

如果我只希望secondAC從firstAC獲取所有數據,但是當我對secondAC進行更改時它不顯示在firstAC中,我該怎麼辦?

感謝一堆答案! Ladislav

回答

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 ][email protected] = 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中可用的獨特優勢 - 它完全向後兼容。

+0

非常感謝您爲這個答案,非常好的例子... thanx爲您的時間! 拉迪斯拉夫 – Ladislav 2009-12-11 14:57:50

5

當您編寫secondAC = firstAC時,只需說明secondAC和firstAC是對相同數組集合的引用。

你想要的是克隆第一個集合(如在,逐個複製所有元素)。

您應該能夠像這樣做:

secondAC = new ArrayCollection(); 
secondAC.addAll(firstAC); 
+0

非常感謝您解釋發生了什麼 – Ladislav 2009-12-09 11:07:48

1

我沒有任何的Flex或ActionScript的想法,不過貌似firstAC和secondAC指向同一個陣列,因此提供預期。

你應該做的只是創建另一個數組,複製成員,他們將是兩個真正不同的實體。

1

而不是secondAC = firstAC,你可以嘗試secondAC.addAll(firstAC)

相關問題