[
https://issues.apache.org/jira/browse/FLEX-23486?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Justin Mclean resolved FLEX-23486.
----------------------------------
Resolution: Fixed
Fix Version/s: Apache Flex 4.10.0
Checked into develop branch
> mx:List / selectedItemsCompareFunction property is not applied correctly
> ------------------------------------------------------------------------
>
> Key: FLEX-23486
> URL: https://issues.apache.org/jira/browse/FLEX-23486
> Project: Apache Flex
> Issue Type: Bug
> Components: mx: List
> Affects Versions: Adobe Flex SDK 3.6 (Release)
> Environment: Affected OS(s): All OS Platforms
> Browser: Firefox 3.x
> Language Found: English
> Reporter: Adobe JIRA
> Labels: easyfix, easytest
> Fix For: Apache Flex 4.10.0
>
>
> Note: issue affects several version of Flex SDK, first noticed in 3.4, but
> same problem exists in latest stable build of 4.0 as well.
> Steps to reproduce:
> 1. Use mx:List control with dataProvider containing non-primitive items (like
> Date, for simplest case)
> 2. Use selectedItemsCompareFunction on mx:List to compare items during
> selection
> 3. Set selectedItems as an array of objects with references different to ones
> used in dataProvider
>
> Actual Results:
> Runtime exception thrown:
> TypeError: Error #1010: A term is undefined and has no properties.
> at
> mx.controls.listClasses::ListBase/setSelectionDataLoop()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:6473]
> at
> mx.controls.listClasses::ListBase/commitSelectedItems()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:6364]
> at mx.controls.listClasses::ListBase/set
> selectedItems()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:2942]
> at ListsCompare/updateLeft()[C:\Documents and Settings\sav\Adobe Flash
> Builder Beta 2\FileDownload\src\ListsCompare.mxml:22]
> at ListsCompare/__lstRight_change()[C:\Documents and Settings\sav\Adobe
> Flash Builder Beta 2\FileDownload\src\ListsCompare.mxml:37]
> ....
> Expected Results:
> selection is applied correctly
> Reason and possible resolution:
> Actually bug fix is super easy. The problem itself lies in fact that List
> temporary stores UID-to-index map of selected items in one function
> function commitSelectedItems(items:Array):void {...}
> and afterward applies it incorrectly in another
> function setSelectionDataLoop(items:Array, index:int, useFind:Boolean =
> true):void {...}
>
> Namely, the following lines causes the problem (from setSelectionDataLoop):
> if (compareFunction(data, item))
> {
> uid = itemToUID(data); // ISSUE IS HERE -- must be itemToUID(item)
>
> selectionDataArray[proposedSelectedItemIndexes[uid]] = new
> ListBaseSelectionData(data, index, false);
> ...
> }
> I.e. proposedSelectedItemIndexes is indexed by UID of objects from
> selectedItems but here it is accessed by UID of objects from dataProvider.
>
> Workaround (if any):
> Given the fact that comparator is invoked right before call to itemToUID and
> comparator is never used in any other place, mx:List may be replaced with
> custom class with the following trick applied:
> package {
> import mx.controls.List;
> public class MyList extends List {
> override public function set
> selectedItemsCompareFunction(value:Function):void {
> super.selectedItemsCompareFunction = value == null ? null :
> function(a:*, b:*):Boolean {
> isComparatorCalled = true;
> latestComparatorParam = b;
> return value(a, b);
> };
> }
>
> private var isComparatorCalled:Boolean = false;
> private var latestComparatorParam:* = null;
>
> override protected function itemToUID(data:Object):String {
> if (!isComparatorCalled)
> return super.itemToUID(data);
> else {
> var param:* = latestComparatorParam;
> isComparatorCalled = false;
> latestComparatorParam = null;
> return super.itemToUID(param);
> }
> }
> }
> }
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira