1

flexでは、dataProvider ( ListCollectionView )から特定のアイテム (selectedItem フィールド) を表示するコンポーネントを使用しています。

私の dataProvider の要素は、さまざまな方法で編集できます。編集されるたびに更新イベントが送信され、dataProvider コレクション (ListCollectionView:: listChangeHandler ) が更新されます。

その過程で、selectedItem が編集された要素である場合、編集されたフィールドがどこにも使用されていなくても、削除されます ( ListCollectionView:: moveItemInViewを介して null に設定されます)。

これを回避する方法はありますか?

より具体的には、以前に保存する必要がなく、紛失して後で復元する必要がありません(ここではほとんど実用的ではありません)。


編集: わかりました、さらに説明できると思います:

私のコードでは、dataProvider にデータバインドされているリストの項目の 1 つのプロパティに影響を与えます。正確な理由はわかりませんが、おそらくアイテムのクラスが [bindable] であるため、これにより更新イベントがスローされます。

このイベントは、ListCollectionView::listChangeHandler にディスパッチする ArrayList::itemUpdateHandler によってキャッチされます。この時点で、イベントの「種類」は「更新」です。これで問題ないように思えます…</p>

しかし、そこからListCollectionView::moveItemInViewに移動します (リストがソートされている場合、アイテムの位置を更新する必要があるため、意味があると思います)。この関数は、アイテムを以前の場所から削除し、新しい場所に追加します。

削除すると、種類が「削除」の新しいイベントが送信されます。そして、ここで問題が発生します。私のコンポーネントは、使用するデータの削除イベントをリッスンし、この要素が削除された場合は selectedItem を削除します。

問題があるのは moveItemInView の呼び出しの周りだと思います: ListCollectionView::handlePropertyChangeEvents の呼び出し(listChangeHandler によって呼び出されます) は次のとおりです: moveItemInView(updateEntry.item, updateEntry.item, eventItems); ( updateEntry.item はリストの変更された項目であり、 eventItems は空の配列です)

そのプロトタイプは次のとおりです。 private function moveItemInView(item:Object, dispatch:Boolean = true, updateEventItems:Array = null):void

それはバグですか?

4

1 に答える 1

1

どのように dataProvider を更新しますか? これなら

list.dataProvider = newDataProvider

次に、表示される動作が期待されます。List の観点から見ると、dataProvider は完全に置き換えられており、List は古い selectedItem/selectedIndex がまだ有効であるかどうかを知る方法がありません。そうではないと仮定するのは正しい仮定だと思います。

または、dataProvider の refresh メソッドを使用して dataProvider を更新しますか。

list.dataProvider.refresh();

このような場合、dataProvider の長さが変わる可能性があります。その要素と同様に。この場合、collectionChange イベントが送出され、リストには collectionChange イベントを処理するメソッドが必要です。List には、以前に選択された項目が新しいリストに含まれるかどうかを知る方法がありません。そのインデックスが変更されるかどうか、または古い selectedIndex がまだ有効であるかどうか。したがって、selectedItem はリセットされます。

通常、どちらの場合でも selectedItem/selectedIndex を保持するには、参照を保存し、dataProvider の変更後にリセットする必要があります。

mySelectedItem = list.dataProvider.selectedItem;
// update dataProvider Here
list.dataProvider.selectedItem = mySelectedItem;

dataProvider 内の項目を更新するだけの場合。その場合、selectedIndex/selectedItem は影響を受けません。

于 2012-12-12T18:34:56.057 に答える