Nice solution Bruno.  I believe that you could also get the parameter
directly out of the request using ExternalContext.  That might be less
strange than assuming the child component is the parameter (I didn't
even know you could do it that way.)  That way if you change the
hierarchy of your component tree your logic doesn't break.

Just another way to do it.  Both approaches have their drawbacks of course ;-)

sean


On 7/5/05, Martin Marinschek <[EMAIL PROTECTED]> wrote:
> That should work with MyFaces out of the box - the only thing you
> might need to do would be to set the preserveDataModel to true - value
> change listeners should not be necessary.
> 
> regards,
> 
> Martin
> 
> On 7/5/05, Bruno Aranda <[EMAIL PROTECTED]> wrote:
> > Hi Jason, I have a solution for you using myfaces. There will be more
> > elegant solutions, but this one should work for you:
> >
> > I take for granted that you have your variable-length array in a
> > backing bean (call 'arrayValues' for instance), with public accessor
> > methods. The code for the jsp page could look like The jsp code could
> > look like
> >
> > [CODE]
> >
> > <h:form>
> > <x:dataTable var="val" value="#{yourBackingBean.arrayValues}"
> > rowIndexVar="indexVar">
> >   <h:column>
> >         <h:inputText value="#{val}"
> > valueChangeListener="#{yourBackingBean.updateValue}">
> >                 <f:param name="index" value="#{indexVar}"/>
> >         </h:inputText>
> >         </h:column>
> >   </x:dataTable>
> >
> > <h:commandButton value="Process array"
> > action="#{yourBackingBean.processArray}"/>
> >
> > </h:form>
> >
> > [/CODE]
> >
> > Every inputText has its valueChangeListener and a parameter. The
> > valueChangeListener should point to a method in your bean that
> > retrieves the new value and the index of the changed component, in
> > order to update the corresponding values of the array, something like
> > this:
> >
> > [CODE]
> >
> > public void updateValue(ValueChangeEvent vce) {
> >         // get the new value of the inputText
> >         String newValue = (String) vce.getNewValue();
> >
> >         // get the child parameter of the inputText (I know it is the
> > only child), to get the index value
> >         UIParameter param = (UIParameter)
> > vce.getComponent().getChildren().get(0);
> >         Integer index = (Integer) param.getValue();
> >
> >         // update the value in the array
> >         arrayValues[index.intValue()] = newValue;
> >     }
> >
> > [/CODE]
> >
> > Then you will have, a column of inputText and one h:commandButton (in
> > the example calls to a method in your backing bean called
> > processArray):
> >
> > Hope this helps,
> >
> > Regards,
> >
> > Bruno
> >
> > 2005/7/5, Jason Nichols <[EMAIL PROTECTED]>:
> > >
> > >
> > >
> > > Another way of asking is can you put h:outputText inside h:dataTable 
> > > without
> > > a commandButton/Link on each line.
> > >
> > >
> > >
> > > Btw although I'm fairly new to jsf I'm not looking for someone to do my 
> > > work
> > > for me, I've been struggling for a week when I realized I've never seen
> > > anything like this on ANY web page, so if it's
> > >
> > > just not possible I'd like to learn why.
> > >
> > > Regards,
> > >
> > > Jason
> >
>

Reply via email to