Flex: выберите узел дерева сразу после назначения / обновления / замены dataProvider - PullRequest
0 голосов
/ 27 января 2011

У меня есть элемент управления Flex-деревом, и я пытаюсь выбрать узел дерева на 3 уровня ниже сразу после того, как dataProvider назначен объект коллекции, как показано ниже.

в основном treeItem1, treeItem2, treeItem3 - это узлы дерева, а treeitem3 - это потомок treeItem2, который является потомком treeItem1. Предположим, что на эти treeItem (1,2,3) правильно ссылаются из элементов коллекции.

Моя проблема в том, что если я жду полной загрузки всего компонента, а затем выбираю узлы, он правильно открывается / выбирается / scrolltoIndex. Однако, если бы я выбрал узел сразу после назначения dataProvider, он даже не открывается и не выбирается (в основном this.treeService.selectedItem всегда равно нулю).

Кто-нибудь может указать, что я сделал не так? что-нибудь должно произойти после назначения dataProvider?

спасибо

this.treeService.dataProvider = oPricingHelper.getCurrentPricingSercicesTreeSource();
this.treeService.expandItem(treeItem1, true);
this.treeService.expandItem(treeItem2, true);
this.treeService.selectedItem = treeItem3;
this.treeService.scrollToIndex(this.treeService.selectedIndex);

Ответы [ 2 ]

2 голосов
/ 29 января 2011

Я использовал событие updateComplete, чтобы узнать, когда компонент (такой как DataGroup или List) завершил рендеринг после выполнения простой задачи (такой как обновление ссылки на dataProvider).Конечно, вы должны быть осторожны и удалить прослушивание updateComplete, потому что оно может работать много, если вам не нужно его запускать.

Что-то вроде:

//...some function...
    this.treeService.addEventListener(FlexEvent.UPDATE_COMPLETE, onTreeUpdateComplete);
    this.treeService.dataProvider = oPricingHelper.getCurrentPricingSercicesTreeSource();
//...rest of some function...

private function onTreeUpdateComplete(event:FlexEvent):void {
    this.treeService.removeEventListener(FlexEvent.UPDATE_COMPLETE, onTreeUpdateComplete);
    this.treeService.expandItem(treeItem1, true);
    this.treeService.expandItem(treeItem2, true);
    this.treeService.selectedItem = treeItem3;
    this.treeService.scrollToIndex(this.treeService.selectedIndex);
}
0 голосов
/ 28 января 2011

Я не уверен, что у вас возникла та же проблема, но у меня, похоже, такая же проблема с использованием расширенной сетки данных, она возникает в тех случаях, когда поставщик данных приемлем как несколько типов, компоненты выполняют некоторую дополнительную работув фоновом режиме, чтобы обернуть вещи во что-то Hierarchical (HierarchicalData или HierarchicalCollectionView) и при этом вызов установщика поставщика данных не является синхронным (поэтому он вернется до фактического назначения внутреннего свойства, хранящего поставщик данных).В этом случае я использовал callLater с умеренным успехом, callLater, как правило, плохая практика, но в основном добавляет функцию в список функций для вызова после выполнения фоновой обработки, поэтому предполагается, что что-то в установщике поставщика данных называется UIComponent.suspendBackgroundProcessing() и что впоследствии он вызовет UIComponent.resumeBackgroundProcessing (), а затем выполнит список функций, добавленных с помощью callLater.В качестве альтернативы вы можете использовать setTimeout (someFunction, 1000).

Оба эти «взлома», реальное решение состоит в том, чтобы покопаться в коде фреймворка и посмотреть, что он на самом деле делает, когда вы указываете ему установить поставщик данных.Везде, где вы видите, что он на самом деле установил поставщик данных, вы можете расширять этот класс и отправлять событие, которое вы можете прослушивать, чтобы запустить функцию для выбора после этой точки.

Если у кого-то есть лучшее решение, пожалуйста,все значит поправьте меня (я бы хотел получить лучший ответ, чем этот)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...