2011-12-08 13 views
1

ListCollectionViewは、同じデータの異なるビューをデイジーチェーン接続するための最適な方法です。いくつかのソースコレクションがあり、ListCollectionView + filterFunctionを使用してソースデータをラップし、そのソースコレクションのサブセットを表示します。ソースコレクションが変更(追加または削除)されると、連鎖LCVは自動的に更新されます。 ソースコレクション変更についてfilterFunctionのは、それが連鎖しLCVに伝播して表示されていない場合は、:私はsourceに新しいマットオブジェクトを追加する場合デイジーチェーンのListCollectionViewは、ソースコレクションのフィルタへの変更を反映していません。

ArrayCollection source = new ArrayCollection(new Array({name: 'Matt'}, {name: 'John'}, {name: 'Zach'})); 
ListCollectionView justMatts = new ListCollectionView(source); 
justMatts.filterFunction(function(obj: Object):Boolean { obj.name == 'Matt' }); 
justMatts.refresh(); 

justMattsは、その変更をピックアップし、再実行しますそのフィルタを期待どおりにします。私は、マットオブジェクトを除外するためにsourceにフィルタを追加justMattsが元のフィルタにその変更をピックアップしていない場合

しかし、:

source.filterFunction(function(obj: Object):Boolean { obj.name != 'Matt' }); 
source.refresh(); 

この時点で、私はjustMattsがCollectionChangeEventを受け取ることを期待しますフィルタを再実行します。すべてのMattsはsourceオブジェクトから除外されているため、justMattsも空になります。しかし、ListCollectionViewコードを見ると、sourceに新しいフィルタが適用されたときに起きるのはCollectionEventKind.REFRESHです。ここで間違ったことをしていますか(間違ったクラスなどを使用していますか)、Flexではsourceフィルタの変更をサポートしていません。

CollectionEventKind.RESETsourceに手動で送信することで期待通りの結果が得られますが、何もサブクラス化する必要はありません。

+0

ArrayCollectionサブクラスListCollectionView。配列の代わりに別のACをラップするACを得ることができるなら、期待どおりに動作させることができます。 –

+0

AFAIKのように動作しません。あなたが言ったように、ACには配列が必要です。 AC#toArrayを呼び出すことによって、フィルタリングされたACの*スナップショット*を取得できますが、スナップショットの後に更新を受け取ることはありません。 –

+0

新しいAC –

答えて

0

私はそれがまったく同じように動作するとは思わないでしょう。 ArrayCollection(LisCollectionView)とexplict ListCollectionViewの両方のソースが、フィルタが独立して動作することで同一であることが期待されます。

しかし、これらの2つのクラスのソースコードを覗いてみると、ACをフィルタリングしてもCollectionChangeイベントが送出されない(リフレッシュが必要なため疑わしい)か、LCVは聞きませんイベントと更新のために。

フィルタをリストに最初に適用してからListCollectionViewを作成すると、期待どおりの結果が得られますか?もしそうでなければ、あなたはこれがどのように動作するはずか誤解していると思います。そうすれば、私は;-)

+0

にリストプロパティを設定できる可能性があります。フィルタをソースに最初に適用し、LCVを作成すると(元のように)、LCVは元のソースではなくフィルタされたソース*で動作しています。たとえば、常にfalseを返すfilterFunctionでソースをフィルタリングした場合、連鎖したコレクションは常に空になります。このブログ記事(http://graemeharker.blogspot.com/2009/04/implementing-presentation-model-in-flex.html)は、これらのフィルタを連鎖できるという前提に基づいています。 –

+0

次にLCVの内部を突っ込んで、なぜコレクション変更イベントに反応しないのかを確認する必要があります。あなたが指しているブログ記事では、あなたがそれをやろうとしているところにデイジーチェーンがないことに注意してください。基底のACは単独で残され、ソートとフィルタはそれに基づいてLCVに適用されます。 –

関連する問題