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:
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}
Gracias @juanca, lo probare
Post a Comment