Search code examples
xpages

dynamic combobox does not update it's binding scopevar when it's items get updated


I ran in some troubles with a combobox. Here is a copy/paste example code to demonstrate my problem.

    <xp:this.beforeRenderResponse><![CDATA[#{javascript://  
        viewScope.value1 = "document.getItemValueString('value1')" + viewScope.document;
        viewScope.value2 = "document.getItemValueString('value2')" + viewScope.document;}]]>
    </xp:this.beforeRenderResponse>

    <xp:button
        value="change document"
        id="button1">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="complete">
            <xp:this.action><![CDATA[#{javascript: viewScope.document = new Date().getMilliseconds()//}]]></xp:this.action>
        </xp:eventHandler>
    </xp:button>
<br></br>
    <xp:comboBox id="comboBox1" value="#{viewScope.value3}">
        <xp:selectItems>
            <xp:this.value><![CDATA[#{javascript:viewScope.value1;}]]></xp:this.value>
        </xp:selectItems>
        <xp:selectItems>
            <xp:this.value><![CDATA[#{javascript:viewScope.value2;}]]></xp:this.value>
        </xp:selectItems>
        <xp:eventHandler
            event="onchange" submit="true" refreshMode="complete">
            <xp:this.action><![CDATA[#{javascript://}]]></xp:this.action>
        </xp:eventHandler>
    </xp:comboBox>
    
    <br></br>
    <xp:text escape="true" id="computedField1" value="#{viewScope.value1}"></xp:text>
    <br></br>
    <xp:text escape="true" id="computedField2" value="#{viewScope.value2}"></xp:text>
    <br></br>
    <xp:text escape="true" id="computedField3" value="#{viewScope.value3}"> </xp:text>

What did I try to accomplish: I have a combobox with two or more calculated selectItems. They depend on which document is currently selected. To demonstrate a switch of documents I use the button change document in this example. When a new document is selected the beforeRenderResponse event gets the itemvalues from the document and puts them in a viewscope var. I have to separate the two values so I can't use a Array for them. That's all working so far but: If I select a value e.g. value2(timestamp1) and do a switch document the viewScope.value3 where the combobox is bound to did not update. It displays the old value2 from the last document until I trigger its onChange event.

How can I force the comboBox to update its viewScope var with its selectItems?


Solution

  • Found a solution wich works at least for my copy/pase example:

    <xp:this.beforeRenderResponse><![CDATA[#{javascript://  
        viewScope.value1 = "document.getItemValueString('value1')" + viewScope.document;
        viewScope.value2 = "document.getItemValueString('value2')" + viewScope.document;
        var list = new Array();
            list.push(value1);
            list.push(value2);
        if(!@IsMember(viewScope.value3,list)){
            viewScope.value3 = list[0];//list.pop();
        }}]]>
    </xp:this.beforeRenderResponse>
    

    Now the viewScope.value3 gets changed to value1 if the documents is changed.