2008-12-23 6 views
5

Lorsque vous utilisez .contains() sur un ArrayCollection dans Flex, il regarde toujours la référence de la mémoire. Il ne semble pas regarder une méthode .equals() ou .toString() méthode ou n'importe quoi remplaçable. Au lieu de cela, je dois parcourir le ArrayCollection à chaque fois et vérifier chaque élément jusqu'à ce que je trouve ce que je cherche.Pourquoi la méthode Contain de ArrayCollection de Flex examine-t-elle la référence de la mémoire?

Est-ce que quelqu'un sait pourquoi Flex/ActionScript a été fait de cette façon? Pourquoi ne pas permettre aux gens d'utiliser la méthode comme ils le souhaitent?

+0

Je partage votre douleur - je suis désireux constamment que Flex avait un égal/modèle GetHashCode construit –

Répondre

2

Eh bien, il semble que l'ArrayCollection ne regarde pas directement la mémoire, mais seulement en dernier recours. Il tentera de trouver un ID unique (UID) pour l'objet. Si l'UID n'existe pas, il en créera un en utilisant UIDUtil.as.

Vous pouvez contourner tout ce problème par défaut en demandant à votre objet d'implémenter l'interface IUID et en fournissant votre propre UID pour l'objet. Le ArrayCollection regardera l'UID que vous lui fournissez.

+3

Désolé, c'est négatif.. Je ne sais pas quelles sources vous regardez, mais celles de 3.2 utilisent "==" pour trouver l'élément si une fonction filterFunction est appliquée et ArrayUtil.getItemIndex ("===") si le ArrayCollection n'est pas trié. S'il est trié, il devient plus compliqué mais il n'y a toujours pas de vérification d'UID. –

+1

-1: J'ai juste essayé l'utilisation proposée de l'interface IUID, mais les méthodes implémentées ne sont jamais appelées ... malheureusement ... Ce serait une fonctionnalité intéressante. – Matyas

2

Vous ne pouviez pas simplement étendre ArrayCollection et remplacer la méthode contains()? Vous pouvez également coller la source de ArrayCollection dans un package "mx/collections" dans votre projet et modifier la source; cette "technique de correction de singe" va remplacer le comportement tout au long de votre projet entier. Cependant, je serais extrêmement prudent à propos de la modification de ArrayCollection de cette manière: comme il est utilisé partout dans les API Flex, il y a de fortes chances que vous commenciez à casser d'autres composants dans le framework.

2

La méthode contains() recherche par référence, correct (je crois même pour les primitives), donc si vous essayez de trouver une chaîne ou un int dans un ArrayCollection, vous devrez faire la recherche vous-même, par une certaine variation de la boucle ou de la recherche. Je ne pense pas qu'aucun d'entre nous pourrait vous dire pourquoi il n'y a pas, disons, un paramètre facultatif sur cette méthode indiquant si vous devez effectuer une recherche par ref ou par val, cependant; alors ça va, comme on dit. Mais je vous mettrai certainement en garde contre le patch-singe du code-cadre - c'est juste pour demander des ennuis. :)

0

je suggère un simple:

in_array($haystack, $arrayCollection->toArray()); 
Questions connexes