06 May 2011

Como recoger el atributo value de un control af:selectOneChoice

Normalmente cuando se utiliza un comboBox, se suele necesitar recoger el valor seleccionado.

En el caso del componente af:selectOneChoice de ADF, devuelve el índice del item seleccionado aunque el atributo valuePassThru este activado. En este caso los items del control se cargan con los datos de una vista; esto se logra arrastrando la "view" desde la sección de "Data Controls" en la página.


El código que genera es similar al siguiente:
...
<af:selectOneChoice 
   value="#{bindings.SmpTtipoProductoView1.inputValue}"
   label="#{bindings.SmpTtipoProductoView1.label}"
   required="#{bindings.SmpTtipoProductoView1.hints.mandatory}"
   shortDesc="#{bindings.SmpTtipoProductoView1.hints.tooltip}"
   id="soc1" valuePassThru="true"
   valueChangeListener="#{backingBeanScope.TaskflowSelectorBean
                                        .tipoProductChangeListener}"
   autoSubmit="true" immediate="true">
                                  
   <f:selectItems 
           value="#{bindings.SmpTtipoProductoView1.items}" id="si1"/>

</af:selectOneChoice>
..
La diferencia esta en que al código generado original le he activado las propiedades autoSubmit e inmediate y le he puesto un listener que se ejecuta cada vez que cambia el valor del combo; en este listener es donde recojo el valor del item seleccionado en base al índice que me pasa el evento "change value" del componente.

...
public void tipoProductChangeListener(ValueChangeEvent valueChangeEvent) {
        
   String index = valueChangeEvent.getNewValue().toString().trim();
   index = index.length() == 0 ? "0":index;
   loadTipoProducto(index);

}

private void loadTipoProducto(String index) {

   String iteratorName = "SmpTtipoProductoView1Iterator";
   String propertyToGetValue = "IdTipoProd";
      
   BindingContext bindingctx = BindingContext.getCurrent();
   BindingContainer bindings = null;
   bindings = bindingctx.getCurrentBindingsEntry();
   DCBindingContainer bindingsImpl = 
        (DCBindingContainer)bindings;

   // your lookup iterator
   DCIteratorBinding dciter = null;
   dciter =
        bindingsImpl.findIteratorBinding(iteratorName); 
   Row temp =
        dciter.getRowAtRangeIndex((Integer.parseInt(index)));

   //your attribute value
   String value = temp.getAttribute(propertyToGetValue).toString();

   setIdTipoProd(value);
}
...

- FIN -

2 comments:

Juan Camilo Ruiz said...

También se podría conseguir si creas un attributeBinding del mismo atributo en el pageDef de la página, luego desde cualquier método se podría hacer referencia al #{bindings.attrName.inputValue}

Emmerson Miranda said...

Gracias @juanca, lo probare