例如,我有兩個ArrayCollection - firstAC和secondAC。如果我做第二個AC = firstAC,並且比第二個AC更改(可能會在其上放置一個過濾器函數),它會以某種方式傳播到第一個AC,任何人都會告訴我爲什麼會發生在Flex或Actionscript 3中?對一個變量的更改傳播到另一個
如果我只希望secondAC從firstAC獲取所有數據,但是當我對secondAC進行更改時它不顯示在firstAC中,我該怎麼辦?
感謝一堆答案! Ladislav
例如,我有兩個ArrayCollection - firstAC和secondAC。如果我做第二個AC = firstAC,並且比第二個AC更改(可能會在其上放置一個過濾器函數),它會以某種方式傳播到第一個AC,任何人都會告訴我爲什麼會發生在Flex或Actionscript 3中?對一個變量的更改傳播到另一個
如果我只希望secondAC從firstAC獲取所有數據,但是當我對secondAC進行更改時它不顯示在firstAC中,我該怎麼辦?
感謝一堆答案! Ladislav
在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中可用的獨特優勢 - 它完全向後兼容。
當您編寫secondAC = firstAC時,只需說明secondAC和firstAC是對相同數組集合的引用。
你想要的是克隆第一個集合(如在,逐個複製所有元素)。
您應該能夠像這樣做:
secondAC = new ArrayCollection();
secondAC.addAll(firstAC);
非常感謝您解釋發生了什麼 – Ladislav 2009-12-09 11:07:48
我沒有任何的Flex或ActionScript的想法,不過貌似firstAC和secondAC指向同一個陣列,因此提供預期。
你應該做的只是創建另一個數組,複製成員,他們將是兩個真正不同的實體。
而不是secondAC = firstAC
,你可以嘗試secondAC.addAll(firstAC)
。
非常感謝您爲這個答案,非常好的例子... thanx爲您的時間! 拉迪斯拉夫 – Ladislav 2009-12-11 14:57:50