We don't know how your renderer is set up, but here are some things to
consider:

 

-a variableRowHeight renderer needs to measure() correctly right after
the data property is set.  Depending on what component is doing
word-wrapping, the measurements may be fluctuating causing the DG to
re-render and recycle renderers and re-set their data properties and do
more measurements until the measurements converge.  Make sure the
word-wrapping component's width is tied to the column's width.  This is
a common error you'll see from my responses to past threads.

-you can see if there are multiple rendering passes by setting a
breakpoint on makeRowsAndColumns.  It should get hit once or twice when
the dataProvider changes, but not more than that.

-I'd juse array.join() to make your displayable string.

 

________________________________

From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of Tom McNeer
Sent: Monday, July 07, 2008 6:38 AM
To: [email protected]
Subject: [flexcoders] Item renderers cause processor to max out

 

Hi, 

I began asking about this problem last week and Alex Harui tried to help
me. But I did such a bad job of explaining my problem, I don't think he
quite understood the issue.

Also, I've done a lot more work over the weekend, stepping through the
debugger. And my problem is a bit different than I first thought,
anyway.

My application allows users to create multiple sets of product
configurations. Within each configuration, there are multiple products,
each with a possibility of multiple options.

Thus, within a Configuration object, there is an itemAC that is a
collection of product objects. Within each Item/Product object, there is
an optionArray which holds Option objects. The optionArray cannot be an
arrayCollection, because the Product objects are VOs populated from a
RemoteObject, and need to match the signature of a matching object on
the server.

When the user wishes to view the contents of a Configuration, the itemAC
(with its collection of Products) becomes the dataProvider of a
DataGrid:

       <mx:DataGrid dataProvider="{config.itemAC}" id="configProducts"
variableRowHeight="true" width="80%"
updateComplete="setGridHeight(event)" >
            <mx:columns>
                <mx:DataGridColumn dataField="quantity"
headerText="Quantity" />
                <mx:DataGridColumn dataField="category"
headerText="Category" />
                <mx:DataGridColumn dataField="name" headerText="Product"
wordWrap="true" />
                <mx:DataGridColumn headerText="Options" wordWrap="true"
itemRenderer="views.OptionList" />
            </mx:columns>
        </mx:DataGrid>

However - one cell within the DataGrid needs to display a list of
options. The user should see these options as a comma-delimited list,
essentially, not a Flex List element or anything like that. So I have
created an itemRenderer for the Options column which has a simple
function that creates the list from the optionArray in the Product which
is represented by a row in the DataGrid:

           public function setOptionList(options:Array):void{
                optionList = "";
                for (var i:int = 0;i<options.length;i++){
                    if (options.length > 1 && i != 0){
                        optionList = optionList + ', ';
                    }
                    optionList += options[i].optionItem;
                }
            }

Since a user may be adding options to a product at any time, the option
list must update as an option is added.
I have tried providing the update in various ways. Currently, I am
overriding the set data function for the itemRenderer component:

            override public function set data(value:Object):void{
                if (value != null){
                    super.data = value;
                    setOptionList(value.options)
                }
                dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
            }

The symptom of my problem is that once a few products are added, the
processor pegs and stays there.

My debugging walkthrough has led to find that as products are added
(with or without options), extra instances of the itemRenderer component
seem to be generated, and the setOptionList function (triggered by set
data) is called over and over.

On the first product added, (with an empty option array), two separate
instances of the itemRenderer component seem to be created. The
setOptionList function is called three times, showing two unique
identifiers for views.OptionList components. The function is called on
the first instance (a), then the second (b), then the first again:
a,b,a.

When I add a second product (also with an empty option array, the
setOptionList function is called 14 times. I can see another instance of
views.OptionList (c). The setOptionList calls go:
b,b,a,a,b,c,b,c,a,a,b,c,a,a.

Adding a third product results in 22 calls to the function, on 4
instances. The calls go: b,c,b,b,a,a,a,b,c,d,b,c,d,a,a,a,b,c,d,a,a,a.

Can anyone help me understand what's up with all this proliferation?


-- 
Thanks,

Tom

Tom McNeer
MediumCool
http://www.mediumcool.com <http://www.mediumcool.com> 
1735 Johnson Road NE
Atlanta, GA 30306
404.589.0560 

 

Reply via email to