2008-12-23 8 views
5

Bei Verwendung von .contains() auf einem ArrayCollection in Flex wird immer die Speicherreferenz betrachtet. Es scheint nicht zu einer .equals() Methode oder .toString() Methode oder etwas overridable aussehen. Stattdessen muss ich jedes Mal die ArrayCollection durchlaufen und jeden einzelnen Artikel überprüfen, bis ich finde, wonach ich suche.Warum untersucht die Array-Collection-Methode von Flex die Speicherreferenz?

Weiß jemand, warum Flex/ActionScript auf diese Weise erstellt wurde? Warum nicht einen Weg von den Leuten zur Verfügung stellen, um die Methode so zu verwenden, wie sie wollen?

+0

ich Ihren Schmerz teilen - ich bin ständig wünschte, dass Flex ein Gleichheits/GetHashCode Modell hatte gebaut in –

Antwort

2

Nun, es scheint, als würde die ArrayCollection nicht direkt in den Speicher schauen, sondern nur als letzten Ausweg. Es wird versucht, eine eindeutige ID (UID) für das Objekt zu finden. Wenn die UID nicht existiert, erstellt sie eine für sie mit UIDUtil.as.

Sie können diese ganzen UID-Standards umgehen, indem Sie Ihr Objekt die IUID-Schnittstelle implementieren und Ihre eigene UID für das Objekt bereitstellen. Die ArrayCollection überprüft die von Ihnen angegebene UID.

+3

Sorry, dass eine negative ist.. Ich weiß nicht, welche Quellen Sie betrachten, aber die von 3.2 verwenden "==", um das Element zu finden, wenn eine Filterfunktion angewendet wird, und ArrayUtil.getItemIndex ("==="), wenn die ArrayCollection nicht sortiert ist. Wenn es sortiert wird, wird es komplizierter, aber es gibt immer noch keine UID-Überprüfung. –

+1

-1: Ich habe gerade die vorgeschlagene Verwendung der IUID-Schnittstelle versucht, aber die implementierten Methoden werden nie aufgerufen ... leider ... Es wäre aber ein nettes Feature. – Matyas

2

Konnte man nicht einfach ArrayCollection erweitern und die contains() -Methode überschreiben? Alternativ können Sie die Quelle für ArrayCollection in ein "mx/collections" -Paket in Ihrem Projekt einfügen und die Quelle ändern. Diese "Affe-Patching-Technik" wird das Verhalten im gesamten Projekt überschreiben. Allerdings wäre ich sehr vorsichtig, wenn es darum geht, ArrayCollection auf diese Weise zu ändern: Da es überall in den Flex-APIs verwendet wird, besteht eine gute Chance, dass Sie andere Komponenten im Framework zerstören.

2

Die contains() -Methode sucht per Referenz, korrekt (ich glaube sogar für primitive), wenn Sie also versuchen, eine Zeichenfolge oder ein int in einer ArrayCollection zu finden, müssen Sie die Suche selbst durchführen, indem etwas Variation von Schleifen oder Suchen. Ich glaube nicht, dass irgendjemand von uns Ihnen sagen könnte, warum es keinen, sagen wir, optionalen Parameter für diese Methode gibt, der angibt, ob nach ref oder nach val gesucht werden soll; so geht es, wie sie sagen.

Aber ich warne Sie auf jeden Fall davor, den Framework-Code zu patchen - das ist nur Ärger. :)

0

würde ich einen einfachen Vorschlag:

in_array($haystack, $arrayCollection->toArray()); 
Verwandte Themen