5

Flex で使用.contains()する場合ArrayCollection、常にメモリ参照が参照されます。.equals()メソッドや.toString()メソッド、またはオーバーライド可能なものを見ているようには見えません。ArrayCollection代わりに、毎回ループして、探しているものが見つかるまで個々の項目をチェックする必要があります。

Flex/ActionScript がこのように作成された理由を知っている人はいますか? 人々が望むようにメソッドを使用するcontains()方法を提供してみませんか?

4

4 に答える 4

2

ええと、ArrayCollectionは実際にはメモリを直接見ているのではなく、最後の手段としてだけ見ているようです。オブジェクトの一意のID(UID)を見つけようとします。UIDが存在しない場合は、UIDUtil.asを使用してUIDを作成します。

オブジェクトにIUIDインターフェイスを実装させ、オブジェクトに独自のUIDを提供することで、このデフォルトのUID全体を回避できます。ArrayCollectionは、指定されたUIDを調べます。

于 2009-04-02T13:45:21.370 に答える
2

contains() メソッドは、正しい参照による検索を行います (プリミティブについても正しいと思います)。そのため、ArrayCollection で文字列または int を見つけようとしている場合は、ループのいくつかのバリエーションによって、自分で検索を行う必要があります。または検索します。ただし、ref または val のどちらで検索するかを示すオプションのパラメーターがそのメソッドにない理由を、私たちの誰にも説明できないと思います。彼らが言うように、それはそうです。

ただし、フレームワーク コードにモンキー パッチを適用することは絶対にやめてください。それはトラブルを招くだけです。:)

于 2008-12-31T18:38:39.323 に答える
2

ArrayCollection を拡張して、contains() メソッドをオーバーライドすることはできませんか? または、ArrayCollection のソースをプロジェクトの "mx/collections" パッケージに貼り付けて、ソースを変更することもできます。この「モンキー パッチ手法」は、プロジェクト全体の動作をオーバーライドします。ただし、そのような方法で ArrayCollection を変更することには非常に注意が必要です。これは Flex API のいたるところで使用されているため、フレームワーク内の他のコンポーネントを破壊し始める可能性が高くなります。

于 2008-12-27T17:41:26.290 に答える
0

簡単なことをお勧めします:

in_array($haystack, $arrayCollection->toArray());
于 2014-02-10T06:05:01.780 に答える