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.RESET
をsource
に手動で送信することで期待通りの結果が得られますが、何もサブクラス化する必要はありません。
ArrayCollectionサブクラスListCollectionView。配列の代わりに別のACをラップするACを得ることができるなら、期待どおりに動作させることができます。 –
AFAIKのように動作しません。あなたが言ったように、ACには配列が必要です。 AC#toArrayを呼び出すことによって、フィルタリングされたACの*スナップショット*を取得できますが、スナップショットの後に更新を受け取ることはありません。 –
新しいAC –