2011-12-08 3 views
1

ListCollectionView는 동일한 데이터의 여러 뷰를 데이지 체인 방식으로 연결하는 좋은 방법입니다. 일부 원본 컬렉션이 있고 ListCollectionView + filterFunction을 사용하여 원본 데이터를 래핑하고 해당 원본 컬렉션의 하위 집합을 제공합니다. 소스 모음이 변경되면 (추가 또는 제거 중) 체인 된 LCV가 자동으로 업데이트됩니다. 소스 컬렉션 변경에 대한 filterFunction의, 그것은 체인 된 LCV에 전파 할 수 나타나지 않는 경우, : 나는 source에 새로운 매트 객체를 추가하는 경우데이지 체인으로 연결된 ListCollectionView는 소스 컬렉션의 필터에 대한 변경 사항을 반영하지 않습니다.

ArrayCollection source = new ArrayCollection(new Array({name: 'Matt'}, {name: 'John'}, {name: 'Zach'})); 
ListCollectionView justMatts = new ListCollectionView(source); 
justMatts.filterFunction(function(obj: Object):Boolean { obj.name == 'Matt' }); 
justMatts.refresh(); 

, justMatts는 그 변화를 선택하고 다시 실행합니다 그 예상대로 필터. 나는 매트 객체를 제외 source에 필터를 추가하는 경우

그러나, justMatts 소스의 필터 그 변화를 선택하지 않습니다이 시점에서

source.filterFunction(function(obj: Object):Boolean { obj.name != 'Matt' }); 
source.refresh(); 

을, 나는 justMatts가 CollectionChangeEvent을 받게 될 것입니다 필터를 재실행하십시오. 모든 매트가 source 오브젝트에서 필터링 되었기 때문에 justMatts도 비어있게됩니다. 그러나 ListCollectionView 코드를 보면 source에 새 필터가 적용될 때 발생하는 CollectionEventKind.REFRESH을 처리하지 않습니다. 내가 틀린 일을하고 있는데 (틀린 클래스를 사용하는 등), 플렉스에서 source 필터의 변경을 지원하지 않습니다.

CollectionEventKind.RESETsource에 수동으로 보내서 예상대로 작동하지만, 서브 클래스를 만들 필요가 없기를 바랬습니다.

+0

ArrayCollection 서브 클래스 ListCollectionView. 배열 대신 다른 AC를 래핑하기 위해 AC를 얻을 수 있다면 예상대로 작동 할 수 있습니다. –

+0

그런 식으로 AFAIK 작동하지 않습니다. 당신이 말한대로 AC에는 Array가 필요합니다. AC# toArray를 호출하여 필터링 된 AC의 * 스냅 샷 *을 얻을 수 있지만 스냅 샷 이후에는 업데이트가 수신되지 않습니다. –

+0

새 AC에 List 속성을 설정할 수 있습니다 –

답변

0

전혀 그렇게 생각하지 않습니다. ArrayCollection (LisCollectionView)과 explict ListCollectionView의 소스가 동일하고 필터가 독립적으로 작동 할 것으로 기대합니다.

그러나이 두 클래스의 소스 코드를 살펴보면 AC를 필터링해도 CollectionChange 이벤트 (새로 고침이 필요하기 때문에 의문스럽지 않음)가 전달되지 않거나 LCV가 수신 대기하지 않는다는 것을 알 수 있습니다 이벤트 및 업데이트.

필터를 목록에 먼저 적용한 다음 ListCollectionView를 만드는 경우 원하는 결과가 표시됩니까? 그렇지 않다면, 나는 이것이 당신이 어떻게 작동해야하는지 잘못 이해했다고 생각합니다. 만약 그렇다면, 나는 가지고있다 ;-)

+0

필터를 소스에 먼저 적용한 다음 LCV를 만들면 (원래대로) LCV가 원본 소스가 아닌 필터링 된 소스 *에서 작동합니다 . 예를 들어 항상 false를 반환하는 filterFunction을 사용하여 소스를 필터링하면 체인으로 연결된 콜렉션도 항상 비어있게됩니다. 이 전체 블로그 기사 (http://graemeharker.blogspot.com/2009/04/implementing-presentation-model-in-flex.html)는 이러한 필터를 연결할 수 있다는 전제에 기반하고 있습니다. –

+0

그러면 LCV 내부를 두드려보고 컬렉션 변경 이벤트에 반응하지 않는 이유를 확인해야 할 것입니다. 당신이 가리키고있는 블로그 포스트에서, 당신이 그것을하려는 방식으로 데이지 체이닝이 없다는 것에주의하십시오. 기본 AC는 그대로두고 분류 및 필터는 LC를 기반으로 LCV에 적용됩니다. –

관련 문제