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