Как я могу сохранить состояние управления деревом? Я бы хотел сохранить состояние дерева, когда он обновляется, а не рушится.Flex: компонент дерева: сохранение состояния при обновлении поставщика данных
ответ
Я не думаю, что есть способ сделать это автоматически (хотя мне никогда не приходилось использовать древовидный контроль). Я бы подумал, что лучше всего будет расширить управление деревьями и самостоятельно обработать запись состояния.
Например, я мог бы переопределить свойство данных, чтобы вы могли запускать функцию проверки состояния перед установкой нового объекта данных на компонент. Глядя на помощь есть методы
isItemOpen(item:Object):Boolean,
и
expandItem(item:Object, open:Boolean, animate:Boolean = false, dispatchEvent:Boolean = false, cause:Event = null):void
Вам необходимо рекурсивно запустить через каждый узел и проверить, если он открыт и хранения состояния для этого узла. Затем, когда он перерисовывается с новым поставщиком данных, рекурсивно запускается через новые узлы и проверяет, были ли какие-либо из них ранее открытыми, и если они были, расширьте их.
Как о чем-то вроде этого:
var openItems:Object = tree.openItems; tree.dataProvider = myNewDataProvider; tree.openItems = openItems; tree.validateNow();
Я не уверен, насколько хорошо это будет работать, если новый DataProvider радикально отличается от старого, но это работает, когда вы ленивые узлы загрузки дерева ,
+1 звучит как хороший звонок мне –
звучит отлично для меня тоже, не может заставить этого ублюдка работать. Когда вы говорите, что это должно работать, если dataProvider радикально отличается, что это значит? обновленный провайдер, который я использую, будет иметь новые или удаленные узлы. – Ronn
На самом деле, я только что протестировал его с помощью некоторого кода, который добавляет и удаляет узлы, и, похоже, он работает отлично для меня (есть, по-видимому, некоторый код в дереве, который проверяет, openItems существуют в дереве и отбрасывают любые, которые этого не делают). Каким образом это не работает? – inferis
Это на самом деле довольно легко сделать. Вам просто нужно убедиться, что компонент связан с его dataProvider, а не просто ссылается на него. Итак, в mxml, это фигурный синтаксис привязки для назначения dataProvider. Кроме того, DP должен быть [Bindable].
Если вы сделаете это, каждый раз, когда вы обновляете (добавляете узлы, удаляете, переименовываете, что угодно) ваш поставщик данных, он будет автоматически обновляться в вашем элементе управления. Не требуется ручное аннулирование или обновление.
Если вам нужен фактический пример кода, дайте мне знать.
И, состояние сохраняется, очевидно, потому что вы не заменяете dataProvider, просто изменяя. – jason
Вам необходимо реализовать интерфейс IUID для объектов данных, представляющих ваши узлы. UID является уникальным идентификатором, который обычно просто строится из данных в объекте, но иногда более точно переопределять это и сделать его некоторым GUID, который постоянно обновляется между поставщиками данных. Таким образом, вышеприведенное будет работать при использовании нового dataprovider, если UID соответствуют.
Надейтесь, что сделал смысл.
Ответ Inferis, связанный с хранением openItems, а затем с последующим установкой их после обновления поставщика данных в сочетании с внедрением интерфейса IUID для объектов в массиве массивов данных.
Более подробная информация о IUID: http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_8.html
Для проекта с BlazeDS я должен был работать с обновлением и перезагрузками данных компонентов дерева, не нарушая работу пользователей (все узлы закрыты, когда данные перезагружается). Вместо того, чтобы хранить вкладки «какой узел был открыт до?» И «какова была позиция прокрутки?», Я нашел способ внедрить новое состояние данных компонента Tree в существующий поставщик данных.
Вот как я заработал. Ключ должен быть вызван
*yourTreeInstance*.validateDisplayList();
после обновления dataprovider вашего дерева. Мой код ниже:
<fx:Script>
<![CDATA[
[Bindable]
var treeDataProvider:XML;
private function onTreeCreated(event:FlexEvent):void{
// update value with new XML here;
treeDataProvider = <node name="root">
<node name="child 1">
<node name = "grand child 1"/>
</node>
</node>;
myTree.openItems = treeDataProvider..node;
myTree.validateDisplayList();
}
]]>
</fx:Script>
<mx:Tree id="myTree" labelField="@name" dataProvider={treeDataProvider}
creationComplete="onTreeCreated(event)"/>
Это сохранит ваше дерево.
Чтобы следующий фрагмент кода
var openItems:Object = tree.openItems;
tree.dataProvider = myNewDataProvider;
tree.openItems = openItems;
tree.validateNow();
или
callLater(keepOpenStateItems);
private function keepOpenStateItems():void {
tree.openItems = openTreeItems;
}
работать, вы должны следовать mattbilson и советы Мишель. Они абсолютно правы.
Только что реализованный IUID объекта, который содержится в дереве dataprovider и voila! Обновление коллекции сохраняет дерево действительно в состоянии, где оно было раньше.
- 1. Flex - компонент прозрачного дерева
- 2. Flex: Комбобокс потеряет фокус при обновлении поставщика данных?
- 3. Как фильтровать поставщика данных для дерева?
- 4. Реактивный дочерний компонент, кажется, не отображается при обновлении родительского состояния?
- 5. Сохранение данных для обновления при обновлении (Unity3D)
- 6. Сохранение значения в базе данных при обновлении
- 7. Сохранение списка условий при обновлении данных AngularJS
- 8. Сохранение данных SQLite при обновлении приложения iOS
- 9. Сохранение структур данных дерева
- 10. Сохранение состояния Увеличения уровня при обновлении страницы в OpenStreetMap
- 11. Сохранение состояния объекта при обновлении страницы в угловом js
- 12. Сохранение состояния/содержимого, загруженного через AJAX при обновлении страницы вручную
- 13. Jstree состояние плагин не сохранение состояния дерева
- 14. Django: Сохранение данных поставщика oteh
- 15. Flex - привязка данных от дерева к репитеру
- 16. Сохранение состояния данных приложения при выходе
- 17. Сохранение состояния при вращении
- 18. Реакция: Задержка при обновлении состояния
- 19. Ошибка поставщика данных .NET .NET при обновлении таблицы iSeries
- 20. Сохранение данных дерева в SQL
- 21. Компонент flex flex
- 22. Сохранение $ stateParams при обновлении $ state - UI-Router
- 23. Сохранение переменных JavaScript при обновлении
- 24. Нечетное поведение в реактиве При обновлении состояния
- 25. Сохранение состояния приложения AIR
- 26. Flex - перетащить узлы листа только в компонент дерева
- 27. Понимание поставщика углового состояния
- 28. Переходы состояния в Flex
- 29. Сохранение состояния MediaPlayer при вращении
- 30. Чтение kendoUI treeview datasource и сохранение состояния дерева
Вы устанавливаете совершенно новый dataProvider во время обновления? Например: myTree.dataProvider = myCollection; –
да, я устанавливаю новый dataProvider, у той же базовой структуры просто больше или меньше узлов. – Ronn