I need a bit of introduction to lay down the problem, so please bare with me: 

I have a component which renders lists of items. A parameter (childcounter)
keeps track of the number of rendered items in the current List. 

I have the requirement. to be able to define on a per-page basis how many
items are rendered at max. I implemented this by simply binding childcounter
param and checking it against a field (say: maxitems) on the page. Depending
on that I can decide on a per-page basis what to do with items that exceed
the maxitems-threshold. (render different blocks, etc) So far so good. 

Currenly Im using this component to render facets
(http://en.wikipedia.org/wiki/Faceted_classification) as part of a
navigation menu. The requirement is to (for each list) render all SELECTED
facets first and then render x (say 5) UNSELECTED facets per list, where x
is defined by maxitems. 

The problem: 
the component doesn't know (and shouldnt know) that it is rendering facets.
So it doens't know if a facet is selected or unselected. Based on that the
childcounter is incremented each time a selected or unselected facet is
rendered, and the maxitem-treshold is reached when 5 facets per group are
rendered (independent whether they are selected or unselected). Obviously
thats not what I want. 

The solution (so I thought) 
1. The component doens't know that it's rendering facets, but the page
knows. Moreover, the component outputs the item that it is currently
rendering. (the facet in this case). 
2. the param childcounter of the component is bound to the page field
'facetCounter'

since as I understand it a param-binding is bi-directional I did the
following: 

Page:
--------------------------
@Component(parameters = {"result=facetdsText",
"row=gGroup","childrow=facet","ulClass=literal:facets",
        "childcounter=facetcounter"})
private CompositeFlexLi facetBlock;

public void setFacetCounter(int facetCounter)
{
   if(facet==null || !facet.getFacet().isSelected()) 
  {
        this.facetCounter = facetCounter;
  }
}

What it does is obvious: 
1. the component renders and updates childcounter, which in effect calls
setFacetCounter(int facetCounter), since its bound to facetCounter. 
2. facetCounter is only updated when the current item is a UNSELECTED facet
(which it knows in contrast to the component)

The actual problem now is that facetCounter indeed is only updated when a
facet is unselected, but the parameter 'childcounter' is still updated,
although it is bound to the field facetCounter which is not updated (they
aren't in sync). 
The behavior now is the following: (say i have 2 selected facets)
childcounter: 1,2,3,4,5
facetfield:     0,0,3,4,5

while i figured it would be:
childcounter: 0,0,1,2,3,4,5
facetfield:     0,0,1,2,3,4,5

Was I expecting to much 'binding-magic' to happen here, or am I missing
something?
If not, what would be your suggestion to tackle this issue? (making the
component aware that its rendering facets is as I explained no option)

Thanks in advance,
Geert-Jan


-- 
View this message in context: 
http://www.nabble.com/T5%3A-%22conditional-parameter-binding%22-or-something-tf4944458.html#a14155127
Sent from the Tapestry - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to