Wednesday, May 23, 2012

ADF Defaulting a backing bean driven select: Thing I learned being stupid 1



I had a selectonechoice that was driven by a pojo data control and I just couldn't get its value defaulted.
The following is what I learned along the way and my unique solution:

Drag and drop the item onto the page as a single choice selectonechoice:
Add a variable to your page binding (open your page and click on the bindings tab - right click on variables under Executables - insert inside variables - select variable - Name:selectedItemValue Type: java.lang.Object

Then click on Page definition file and update the variable you just added and add these attributes DefaultValue="#{}" IsUpdateable="2".
NOTE: the bold bit must be the value you want to default to.

Or you can just paste the xml like such:

<variable Type="java.lang.Integer" Name="selectedItemValue" DefaultValue="#{}" IsUpdateable="2" />

Then update your list binding to something like this (you can get this done using the green plus button but I am too lazy to post how if you need to know ask):

    <list StaticList="false" IterBinding="variables"
          ListIter="listItemsIterator" NullValueFlag="start" id="selectedItemValueList">
        <Item Value="selectedItemValue"/>
        <Item Value="id"/>
        <<tem Value="name"/>

NullValueFlag="start" - gives you an empty item

This be my select one choice.
          <af:selectOneChoice value="#{bindings.selectedItemValueList.inputValue}"
                              valuePassThru="true" autoSubmit="true"
            <f:selectItems value="#{bindings.selectedItemValueList.items}" id="siI"/>

Handy helpful EL:

1) #{bindings.selectedItemValueList.attribute} - this will give you the actual id of the select box selected item
2) #{bindings.selectedItemValueList.inputValue} = this will give you the index 0 based of the selected item
3) #{bindings.selectedItemValueList.selectedValue == null ? null : bindings.selectedItemValueList.selectedValue.dataProvider} - this gives you the actual underlying object used so you can get the label from here.

Save Button
The save button I use because I need the object not just the object id

            <af:setPropertyListener from="#{bindings.selectedItemValueList.selectedValue == null ? null : bindings. selectedItemValueList .selectedValue.dataProvider}"

Random code

        Object expr = JsfUtil.resolveELExpression("#{bindings.selectedItemValueList}");
        if (expr instanceof FacesCtrlListBinding) {
            FacesCtrlListBinding list = (FacesCtrlListBinding)expr;
            UIComponent component = valueChangeEvent.getComponent();
            component.processUpdates(FacesContext.getCurrentInstance()); //do model updates for this comp
            DCDataRow row = (DCDataRow)list.getSelectedValue();
            ListItem i = (ListItem)().getDataProvider(); // get actual object via code

Create a list and change the binding xml for your list (ListOperMode attribute) from navigation to  setAttribute and see hoe things change

No comments:

Post a Comment