2013-03-15 5 views
1

Возможно ли обновить только один элемент в flex DataProvider?Обновление только части поставщика данных. Возможное?

Например, достижение чего-то вроде этого

[Bindable] 
private var nodes : VectorCollection = new VectorCollection(); 

/* thousands of insertions on nodes */ 

/* Triggered by some event */ 
public function nodeStatusChanged(nodeId : Number) : void { 
     nodes.refresh(nodeId); 
} 

а не делать nodes.refresh() на каждом nodeStatusChanged(nodeId) вызове

Есть мысли? Спасибо заранее.

+0

Я не уверен, что я понимаю ваш вопрос. Если вы измените один элемент в коллекции, он ** должен ** отправить соответствующее событие CollectionChange. Я делаю некоторые предположения здесь: 1) класс VectorCollection, который вы используете, реализует интерфейс IList (поэтому вы можете использовать векторную коллекцию для всего, что ожидает ArrayCollection или аналогичный класс IList), 2) VectorCollection направляет соответствующие Событие CollectionChange, которое указывает, что один или несколько элементов в коллекции были изменены (например, ArrayCollection). –

+0

PS: Я написал [свой собственный класс VectorCollection] (https://github.com/sunild/Flex-Collection-Utils) несколько лет назад и отправляет соответствующие события CollectionChange. Цель реализации заключалась в том, чтобы сделать ее максимально возможной, уменьшив количество кастинга, которое произойдет. –

ответ

1

Я не уверен, что полностью понимаю вашу проблему, но если вы хотите, чтобы ваша коллекция собирала только одно событие при одновременном добавлении большого количества значений, вам следует использовать вектор-посредник:

var tempVector:Vector.<Node> = new Vector.<Node>(); 
// Do whatever you need to perform here; 
nodes.vector = tempVector; 
nodes.refresh(); 

Где вы заменяете узел именем класса, который вы используете с вашим вектором. В вашем методе refresh(), вы затем направить ваше событие:

dispatchEvent(new CollectionEvent(CollectionEvent.COLLECTION_CHANGE)); 
+0

Обратите внимание, что вам действительно нужно отправить правильное событие изменения коллекции ... Например, вы не указываете тип изменения (CollectionEventKind). Вы также не указываете элементы, которые были изменены. Например, когда «вид» события - CollectionEventKind.ADD, они указывают индекс добавленного элемента и добавляемый элемент. Когда он ЗАМЕНИТЬ, пропустите индекс, старый элемент и новый элемент. Это не так просто, как ваш пример :) –

1

Вы можете попробовать с этим

Для обновления одного элемента в vectorcollection вы можете использовать itemUpdated() в ICollectionView.

Вы также можете использовать метод itemUpdated(), чтобы уведомить коллекцию изменений объекту поставщика данных, если объект не реализует интерфейс IEventDispatcher;

[Bindable] 
private var nodes:VectorCollection = new VectorCollection(); 

При обновлении поля в VectorCollection узлов, следующим образом, управление не обновляется автоматически, так что используйте itemUpdated().

nodes.getItemAt(0).field1="someOtherValue"; 

nodes.itemUpdated(nodes.getItemAt(0)); 

Instead of nodes.refresh();