Xpages依赖字段查找

时间:2014-05-08 20:44:55

标签: xpages

我无法在Xpages中获得简单的两个字段依赖关系。

Field1是一个组合框,其选择来自DBLookup。

Field2是一个组合框,其选择来自DBLookup,它使用Field1中的值来对选择进行子集化。

我的代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core"
        xmlns:xp_1="http://www.ibm.com/xsp/coreex">
        <xp:this.data>
            <xp:dominoDocument var="document1" formName="timeEntry"></xp:dominoDocument>
        </xp:this.data>

        <xp:comboBox id="comboBox1">
            <xp:this.defaultValue><![CDATA[#{javascript:""}]]></xp:this.defaultValue>
            <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript:var db = new Array(@DbName()[0], 'TSCTT.nsf'); 
    @DbColumn(db, "workCategoryView", 1)}]]></xp:this.value>
            </xp:selectItems>
            <xp:eventHandler event="onchange" submit="true"
                refreshMode="complete">
            </xp:eventHandler>
            </xp:comboBox>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:comboBox id="comboBox2">
            <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript:var db = new Array(@DbName()[0], 'TSCTT.nsf'); 
    var key:String = document1.getItemValueString("comboBox1");
    @DbLookup(db,"(DBLookupWorkSubCategoryView)",key,2);}]]></xp:this.value>
            </xp:selectItems>
        </xp:comboBox>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript:var db = new Array(@DbName()[0], 'TSCTT.nsf'); 
    var key:String = document1.getItemValueString("djFilteringSelect1");
    @DbLookup(db,"(DBLookupWorkSubCategoryView)",key,2);}]]></xp:this.value>
            </xp:selectItems>

    </xp:selectItems></xp:view>

我按照您的建议更新了代码,但它仍然无效。

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core"
        xmlns:xp_1="http://www.ibm.com/xsp/coreex">
        <xp:this.data>
            <xp:dominoDocument var="document1" formName="timeEntry"></xp:dominoDocument>
        </xp:this.data>

        <xp:comboBox id="comboBox1" value="#{document1.workCategory}">
            <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript:var db = new Array(@DbName()[0], 'TSCTT.nsf'); 
    @DbColumn(db, "workCategoryView", 1)}]]></xp:this.value>
            </xp:selectItems>
            <xp:eventHandler event="onchange" submit="true"
                refreshMode="partial" refreshId="comboBox2">
            </xp:eventHandler>
        </xp:comboBox>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:comboBox id="comboBox2" value="#{document1.workSubCategory}">
            <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript://var db = new Array(@DbName()[0], 'TSCTT.nsf'); 
    var key:String = document1.getItemValueString("comboBox1");
    //@DbLookup(db,"(DBLookupWorkSubCategoryView)",key,2);
    //var key = document1.getItemValue("comboBox1");
    //var key = currentDocument.getItemValueString("comboBox1")
    key

    //var item = document1.getValue("comboBox1");
    //return item;}]]></xp:this.value>
            </xp:selectItems>
        </xp:comboBox>
        <xp:br></xp:br>
        <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript:var db = new Array(@DbName()[0], 'TSCTT.nsf'); 
    var key:String = document1.getItemValueString("djFilteringSelect1");
    @DbLookup(db,"(DBLookupWorkSubCategoryView)",key,2);}]]></xp:this.value>
            </xp:selectItems></xp:view>

2 个答案:

答案 0 :(得分:3)

要改变的事情:

  • 将onChange事件更改为第二个组合框的部分刷新

  • 将您的组合框绑定到document1上的字段。现在它们没有绑定,因此您无法使用document1.getItemValueString()

  • 获取所选值。
  • 删除放置在组合框之外的第3个selectItems标记

答案 1 :(得分:1)

我注意到value属性中的代码被评估了2次,所以我更喜欢对事件进行查找或计算:

<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:this.data>
        <xp:dominoDocument var="document1"
            formName="TestComboDependency">
        </xp:dominoDocument>
    </xp:this.data>

    <xp:this.beforePageLoad><![CDATA[#{javascript:
        viewScope.choiceList1 = @DbColumn("", "($LkpChoiceList1)", 1);
        viewScope.choiceEmpty2 = " --- Select a value for combo1 before --- ";
        viewScope.choiceList2 = null;
    }]]></xp:this.beforePageLoad>

    <xp:comboBox id="comboBox1" value="#{document1.Combo1}">
        <xp:selectItem
            itemLabel=" --- Select a value --- "
            itemValue=""
            id="selectItem1" />
        <xp:selectItems
            value="#{viewScope.choiceList1}"
            id="selectItems1" />
        <xp:eventHandler event="onchange" submit="true"
            refreshMode="partial" refreshId="comboBox2"
            disableValidators="true">
            <xp:this.action><![CDATA[#{javascript:
                var sKey:string = document1.getItemValueString("Combo1");
                viewScope.choiceEmpty2 = " --- Select a value --- ";
                viewScope.choiceList2 = @DbLookup("", "($LkpChoiceList2)", sKey, 2);
            }]]></xp:this.action>
        </xp:eventHandler>
    </xp:comboBox>

    <xp:comboBox id="comboBox2" value="#{document1.Combo2}">
        <xp:selectItem
            itemLabel="#{viewScope.choiceEmpty2}"
            itemValue=""
            id="selectItem2" />
        <xp:selectItems
            value="#{viewScope.choiceList2}"
            id="selectItems2" />
    </xp:comboBox>

</xp:view>