[ 
https://issues.apache.org/jira/browse/FLEX-16418?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Justin Mclean updated FLEX-16418:
---------------------------------

    Labels: easyfix easytest  (was: )
    
> ComboBase selectItem leads to error with empty dataProvider
> -----------------------------------------------------------
>
>                 Key: FLEX-16418
>                 URL: https://issues.apache.org/jira/browse/FLEX-16418
>             Project: Apache Flex
>          Issue Type: Bug
>          Components: mx: ComboBox
>    Affects Versions: Adobe Flex SDK 3.1 (Release)
>         Environment: Affected OS(s): All OS Platforms
> Affected OS(s): All OS Platforms
> Language Found: English
>            Reporter: Adobe JIRA
>              Labels: easyfix, easytest
>
> Steps to reproduce:
> 1. Create ComboBox. It's dataProvider is ArrayCollection with filterFunction. 
> Filter Function is very simple - it's check items and return only those which 
> identities are positive.
> In example: 
> dataProvider [{identity: 1}, {identity: -1}, {identity: -2}, {identity: -3}]
> 2. Then we add event listener on this ArrayCollection, which will check for 
> COLLECTION_CHANGE event and re-select first positive number (In our cases)
> 3. Set selectedItem to {identity: 1}
> 4. Remove {identity: 1} item from dataProvider. After that CollectionChange 
> handler function will be executed, and it tries to set null into selectedItem 
> (which in that moment is {identity: 1})
>  
>  Actual Results:
> Fails with exception:
>  ReferenceError: Error #1069: Property data not found on Object and there is 
> no default value.
>       at mx.controls::ComboBase/get 
> value()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\controls\ComboBase.as:880]
>       at 
> mx.controls::ComboBase/setSelectedItem()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\controls\ComboBase.as:717]
>       at mx.controls::ComboBase/set 
> selectedItem()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\controls\ComboBase.as:706]
>       at mx.controls::ComboBox/set 
> selectedItem()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\controls\ComboBox.as:842]
>       at 
> mx.controls::ComboBase/updateDisplayList()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\controls\ComboBase.as:1211]
>       at 
> mx.controls::ComboBox/updateDisplayList()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\controls\ComboBox.as:1208]
>       at 
> mx.core::UIComponent/validateDisplayList()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\core\UIComponent.as:6293]
>       at 
> mx.managers::LayoutManager/validateDisplayList()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:605]
>       at 
> mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\3.1.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:678]
>       at Function/http://adobe.com/AS3/2006/builtin::apply()
>  
>  Expected Results:
> Should work 
>  
>  Workaround (if any):
>  
> In mx.controls.ComboBase I've found method
>     public function get value():Object
>     {
>         if (_editable)
>             return text;
>         var item:Object = selectedItem;
>         if (item == null || typeof(item) != "object")
>             return item;
>         // Note: the explicit comparison with null is important, because 
> otherwise when
>         // the data is zero, the label will be returned.  See bug 183294 for 
> an example.
>         return item.data != null ? item.data : item.label;
>     }
> As you notice my {identity: 1} item has no properties "data" and "label" and 
> function crashed in this lines. Maybe it will be right to make like this:
> if (item.hasOwnProperty("data") && item.data!=null)
>   return item.data;
> if (item.hasOwnProperty(labelField) && item.labelField!=null)
>   return item[labelField];
> if (item.hasOwnProperty("label") &7 item.label!=null)
>   return item.label;
> And another method 
>     private function setSelectedItem(data:Object, clearFirst:Boolean = 
> true):void
>     {
>         //2 code paths: one for before collection, one after
>         if (!collection || collection.length == 0)
>         {
>             _selectedItem = value;
>             selectedItemChanged = true;
>             invalidateDisplayList();
>             return;
>         }
>    ...
>   }
> My collection (it's dataProvider) is empty, that's why this methods tries to 
> make: _selectedItem = value;
> I think this is mistake in this method, because setSelectedItem has two 
> arguments "data" and "clearFirst". There is no "value" argument. Maybe you 
> should use "data" instead of value in that case. Because value is a getter 
> function which cause the problem i've described earlier.
> return item;

--
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

Reply via email to