2012-03-13 6 views
0

flex 4.5에서는 itemRenderer를 사용하여 arrayCollection을로드하는 스파크 목록 (mxml 스타일 - _myList 및 borderContainer는 부모 응용 프로그램 외부의 라이브러리에 저장 됨)을로드하는 BorderContainer가있는 응용 프로그램이 있습니다 itemRenderer가 인 라인 렌더러가 아닙니다.리스트의 항목의 선택시에, itemRenderer가 전개되어리스트의 선택 항목으로부터 건네받은 데이터에 근거 해 아이템 렌더러 내의 특정의 컨트롤을로드 해, 사용자가 검색을 실행할 수 있도록 (듯이)합니다. 이것은 목록에 대한 dataProvider를 변경하려고 할 때까지 (사용자가 새로운 변수를 사용하여 새 dataProvider를 만드는 데이터 소스를 전환 할 수있게 할 때까지) 시작 /로드시에 모두 잘 작동합니다. 나는 시도했다 :itemrenderers가있는 플렉스 스파크 목록에서 dataprovider를 어떻게 변경합니까?

//app crashes 
_myList.dataProvider.removeAll(); 

//app crashes 
_myList.dataProvider = new ArrayCollection(); 
_myList.dataProvider = acNew;(the new array collection to populate the list) 

//app doesn't crash, but I can't get to any of the global variables upon 
//re-creation at the parent app level (even though I assigned it an id) 
//so this is causing more headaches than I wanted 

this.removeElement(_myList); 
var searchList:SearchNew = new SearchNew(); 
searchList.percentWidth = 100; 
searchList.percentHeight = 100; 
searchList.id = "_myList"; 
searchList.setStyle("fontFamily","MyriadNoCFF"); 
searchList.g_appName = this.g_appName; 
searchList.g_sessionID = this.g_sessionID; 
searchList.g_TableID = this.g_tableID; 
searchList.g_targetedLayer = this.g_tName; 
searchList.g_testAC = new ArrayCollection(); 
searchList.g_item = <item/>; 
searchList.g_req = <req/>; 
searchList.g_sub_req = <req/>; 
searchList.g_prev_where = <where/>; 
searchList.g_prev_ws = <w/>; 
searchList.g_breadcrumbsAC = new ArrayCollection(); 
searchList.g_controlType = "";   
searchList.itemRenderer = new ClassFactory(myItemRenderer); 
searchList.dataProvider = acNew; 
this.addElement(searchList); 

나는 _myList.dataGroup.invalidateDisplayList(); (ArrayCollection에 같은 _myList.dataProvider) 때 .refresh() 시도했습니다; .....이 전혀 작동하지 않고 단지 응용 프로그램됩니다 충돌을 계속합니다.

누구나 이전 dataProvider를 지우고 spark list의 새 arrayCollection을 기반으로 dataProvider를 재 할당하는 방법에 대한 조언이 있습니까? 아마도 이것은 내 itemRenderer와 관련이 있습니까? 내가 먼저 그걸 죽여야 할까?

고급 itemRenderer를 처음 사용했습니다. 여기에 예제가있다 :

http://flexponential.com/2009/09/23/deleting-items-in-a-list-from-an-item-renderer/ (가지) 나는 그것이 (하고 싶은 일을 할 것입니다

대신 removeItemAt를 사용하여, 나는에서 removeAll(), 그리고 외부 목록 상자 값의 변화를 사용하는 경우 언급 된 모든 구성 요소는 항목 렌더러 자체 내에서 클릭 대신 함수를 시작합니다.) 인라인 렌더러이고 제 위치에 있지 않습니다. 내 목록을 포함하는 borderContainer에서 deleteItem() 함수에 액세스하는 방법을 모르겠습니다.

모든 안내가 크게 감사드립니다!

+0

앱이 다운 된 경우 몇 가지 세부 정보를 제공 할 수 있습니까? 런타임 오류가 발생합니까? 그렇다면 오류는 무엇입니까? – JeffryHouser

+0

런타임 오류 없음 .... 로깅 오류 없음 (필자의 function/try/catch) ... 운명의 화면이 회색으로 표시됩니다. 왜 아무런 징조도없이 끊어지게됩니다. – jeep

답변

1

사람이 최선의 방법은 충돌없이 스파크 목록의 새로운 의 ArrayCollection을 기반으로하는 dataProvider를 이전 의 dataProvider을 취소하고 재 할당에 대한 조언이 있습니까?

이 작동합니다 : 당신 만의 dataProvider에 단일 항목을 업데이트하려면

myList.dataProvider = myNewDataProvider; 

당신이 새로 렌더링을 강제로 컬렉션 itemUpdated()를 호출 한 후 그것을를 업데이트 할 수 있습니다.

아마도 내 itemRenderer와 관련이 있습니까? 내가 먼저 죽여야합니까?

itemRenderer와 관련이 있는지 의심 스럽지만 코드를 보지 않고는 말하기 어렵습니다. 앱이 충돌 할 때 정확히 무슨 일이 일어나는지 자세히 설명하고자 할 수 있습니다. 런타임 오류가 발생합니까? 또는 다른 것?

+0

코드를 게시 할 수 있지만 끔찍한 일입니다! 런타임 오류도 발생하지 않습니다. 또한 try/catch 함수가 있고 오류가 반환됩니다 ...그냥 매달려. 데이터 공급자의 단일 항목을 업데이트하고 싶지 않습니다. 전체 dataProvider를 완전히 전환하고 싶습니다. – jeep

+0

앱이 끊어진 후에 Chrome에서 디버그 콘솔을 실행하면 앱이 중단을 해제하지만 dataProvider는 변경되지 않습니다. – jeep

+0

코드를 살펴보고 "간단한"샘플을 빌드하여 문제를 강조 할 수 있는지 확인하십시오. 그런 다음 우리와 공유하십시오. 렌더러에 무한 루프가있을 가능성이 있습니다. 이는 런타임 오류가 발생하지 않을 가능성이 가장 높습니다. – JeffryHouser