You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@flex.apache.org by "Justin Mclean (JIRA)" <ji...@apache.org> on 2013/04/24 01:11:19 UTC

[jira] [Updated] (FLEX-16418) ComboBase selectItem leads to error with empty dataProvider

     [ 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