2011-01-26 3 views
0

저는 Flex 트리 컨트롤을 가지고 있으며 dataProvider가 다음과 같은 컬렉션 객체로 할당 된 직후 3 레벨 아래의 트리 노드를 선택하려고합니다.flex : dataProvider가 할당/업데이트/대체 된 직후에 트리 노드를 선택하십시오.

기본적으로 treeItem1, treeItem2, treeItem3은 트리의 노드이고 treeitem3은 treeItem1의 하위 트리 인 treeItem2의 하위 노드입니다. 이러한 treeItem (1,2,3)이 컬렉션 항목에서 올바르게 참조된다고 가정합니다.

내 문제는 전체 구성 요소가 완전히로드 된 다음 노드를 선택하면 열거 나/select/scrolltoIndex가 올바르게 열리는 문제입니다. 그러나 dataProvider가 할당 된 직후 노드를 선택했다면 열거 나 선택조차하지 않습니다 (기본적으로 this.treeService.selectedItem은 항상 null입니다).

누구든지 내가 잘못 한 것을 지적 할 수 있습니까? 거기에 아무것도 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

내가 때 알 수 있도록 updateComplete 이벤트를 사용했다 (I이보다 더 나은 답을 사랑) 날 수정 같은 DATAGROUP 또는 목록과 같은 구성 요소 ()는 간단한 작업 (예 : dataProvider 참조 업데이트)을 수행 한 후에 렌더링을 완료했습니다. 물론 updateComplete를 실행해야 할 필요가 없다면 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

난 당신이 같은 문제가 발생 긍정적 아니에요하지만 고급 데이터 그리드를 사용하여 동일한 유형의 문제점을 갖고있는 것 같다, 그것은 DataProvider에로 허용 이러한 경우에 나타납니다 여러 유형의 경우 구성 요소는 배경에서 무언가를 계층 적 (HierarchicalData 또는 HierarchicalCollectionView)으로 포장하기 위해 추가 작업을 수행하며 dataprovider setter 호출은 동기가 아닙니다 (따라서 dataprovider를 저장하는 내부 속성을 실제로 할당하기 전에 반환됩니다). 이 경우 callLater를 보통의 성공으로 사용했지만 callLater는 일반적으로 나쁜 습관이지만 기본적으로 백그라운드 처리가 완료되면 호출 할 함수 목록에 함수를 추가하므로이 함수는 dataprovider setter에서 UIComponent.suspendBackgroundProcessing()를 호출하고 UIComponent.resumeBackgroundProcessing()을 호출 한 다음 callLater를 사용하여 추가 된 함수 목록을 실행합니다. 또는 setTimeout (someFunction, 1000)을 사용할 수 있습니다.

두 가지 모두 해킹입니다. 실제 솔루션은 프레임 워크 코드를 파헤 치고 데이터 제공자를 설정하기 위해 실제로 말할 때 무엇인지 확인하는 것입니다. 어디에서나 데이터 제공자를 실제로 설정 했으므로이 클래스를 확장하고이 시점 이후에 선택을 수행하는 함수를 실행하기 위해들을 수있는 이벤트를 전달할 수 있습니다.

사람이 꼭 더 나은 솔루션하시기 바랍니다가있는 경우

관련 문제