Java 在自定义控件的compositeData中定义对象属性

Java 在自定义控件的compositeData中定义对象属性,java,xpages,Java,Xpages,我正在构建一个应用程序,其中mainDoc可以包含一个或多个相关的notes文档。在mainDoc中有一个重复控件,它绑定到Payments.getAllItems(WFSMainDoc.getValue(“LinkKey”)java类Payments具有操纵PaymentItems和ArrayList的方法。getAllItems方法获取所有相关的NotesDocuments并将它们加载到ArrayList中。如果ArrayList已经存在,它只返回以前构建的ArrayList。重复设置中的按

我正在构建一个应用程序,其中mainDoc可以包含一个或多个相关的notes文档。在mainDoc中有一个重复控件,它绑定到
Payments.getAllItems(WFSMainDoc.getValue(“LinkKey”)java类Payments具有操纵PaymentItems和ArrayList的方法。getAllItems方法获取所有相关的NotesDocuments并将它们加载到ArrayList中。如果ArrayList已经存在,它只返回以前构建的ArrayList。重复设置中的按钮
viewScope.vsRIndex=rIndex
viewScope.vsShowPayment=true
现在显示panelPaymentDetail和自定义控件,该控件具有java.lang.Object类型的自定义属性,并使用
pItem=Payments.getItem(rIndex)加载pItem;返回桩

上面所有的工作,我有一对夫妇的样本控制下面。我有两个问题: 1.
compositeData.pItem
是一次又一次地计算的,据我所知,它一直从
Payments.getAllItems()
返回原始值,即使我在付款输入“表单”中编辑它们——那么问题是我如何阻止这种重复计算

  • Payment Input自定义控件中的save按钮似乎没有启动(单击时不会出现任何打印语句),我认为重新加载对象pItem会造成阻碍
  • 测试主文件控制:

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core" 
    xmlns:xc="http://www.ibm.com/xsp/custom">
        <xp:this.data>
            <xp:dominoDocument var="WFSMainDoc" formName="frmMainDoc"
                computeWithForm="onsave" ignoreRequestParams="false">
                <xp:this.documentId><![CDATA[${javascript:var UNID:String = sessionScope.get("ssUNID");
    (UNID == null || UNID == "") ? "" : UNID}]]></xp:this.documentId>
                <xp:this.action><![CDATA[${javascript:if (sessionScope.containsKey("ssUNID")){
        if(sessionScope.get('ssUNID').length){
            sessionScope.get('ssAction') == 'edit' ? 'editDocument':'openDocument'
        } else {
            return 'createDocument'
            break;
        }
    }else{
        return "createDocument";
        break;
    }}]]></xp:this.action>
                <xp:this.databaseName><![CDATA[${appProps[sessionScope.ssApplication].appFilePath}]]></xp:this.databaseName>
            </xp:dominoDocument>
        </xp:this.data>
    
        Main document
        <xp:br></xp:br>
    
        <xp:inputText id="inputText1" value="#{WFSMainDoc.LinkKey}"
            defaultValue="#{javascript:@Unique}">
        </xp:inputText>
    
        <xp:br></xp:br>
        Other Fields and controls
        <xp:br></xp:br>
        <xp:panel id="panelPaymentContainer">
            <xp:repeat id="repeatData" rows="10" var="pItem"
                indexVar="rIndex">
                <xp:this.value><![CDATA[#{javascript:Payments.getAllItems(WFSMainDoc.getValue("LinkKey"));}]]></xp:this.value>
                <xp:button id="buttonEditPayment"
                    rendered="#{javascript:(WFSMainDoc.isEditable())}">
                    <xp:eventHandler event="onclick" submit="true"
                        refreshMode="partial" refreshId="panelPaymentsContainer">
                        <xp:this.action><![CDATA[#{javascript:try{
    viewScope.vsRIndex = rIndex;
    viewScope.vsShowPayment = true;
    break;
    }catch(e){
        WFSUtils.sysOut("Error in calling dialogPayment " + e.tostring)
    }}]]>
                        </xp:this.action>
                    </xp:eventHandler>
                </xp:button>
                <br />
    
            </xp:repeat>
            <xp:panel id="panelPaymentInput">
                <xp:this.styleClass><![CDATA[#{javascript:(viewScope.vsShowPayment) ? "" : "display=none";}]]></xp:this.styleClass>
    
    
                <xc:ccTestPaymentInput rendered="#{javascript:(viewScope.vsShowPayment)}">
                    <xc:this.pItem><![CDATA[#{javascript:try{
            var debug:Boolean = true;
            if (debug) WFSUtils.sysOut("Open existing row = " + viewScope.vsRIndex)
            rIndex = parseInt(viewScope.vsRIndex.toString());
            if (debug) WFSUtils.sysOut("rIndex = " + rIndex);
            pItem = Payments.getItem(rIndex);
            return pItem;
    
    }catch(e){
        WFSUtils.sysOut("Failure in Custom Prop of add item " + e.toString());
        return null;
    }}]]></xc:this.pItem>
                </xc:ccTestPaymentInput>
            </xp:panel>
        </xp:panel><!-- panelPaymentContainer -->
        <xp:br></xp:br>
        <xp:br></xp:br>
    </xp:view>
    
    
    主要文件
    其他字段和控件
    
    付款输入控制

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    
        <xp:br></xp:br>
    
        Actual Pay Date:&#160; 
        <xp:inputText id="actualPayDate"
            value="#{compositeData.pItem.actualPayDate}">
            <xp:dateTimeHelper id="dateTimeHelper1"></xp:dateTimeHelper>
            <xp:this.converter>
                <xp:convertDateTime type="date"></xp:convertDateTime>
            </xp:this.converter>
        </xp:inputText>
        <br /> <br />
        <xp:button value="Save" id="button1">
                                <xp:eventHandler event="onclick"
                                    submit="true" refreshMode="partial" refreshId="panelPayments">
                                    <xp:this.action><![CDATA[#{javascript:try{
    
    var debug:Boolean = true;
    if (debug) print("Start Payment save");
    var pos:Integer = parseInt(viewScope.vsRIndex.toString());
    if (debug) print("Working with pos = " +  pos + " Call saveThisItem");
    
    if (Payments.saveThisItem(compositeData.pItem , pos)){
        if (debug) print("save Payments Worked ");
    }else{
        if (debug) print("save Payments FAILED ");
    }
    
    }catch(e){
        print("payment save Error " + e.tostring);
    
    }finally{
        viewScope.vsExpPayDate = "";
        viewScope.remove("vsShowPayment");
        viewScope.remove("vsRIndex");
        viewScope.remove("vsGotItem")
    }}]]></xp:this.action>
                                </xp:eventHandler>
        </xp:button>
    
    
    </xp:view>
    
    
    实际支付日期: ;
    


    这一切都非常复杂,我还远远不能理解您在这里想要实现的目标。但至少我在你的代码中发现了一些奇怪之处:

    ad 1:有一个id为=“panelPaymentContainer”的面板,其中包含一个重复项。在该重复中有一个按钮正在id=“panelPaymentsContainer”>>上执行部分刷新,这是一个打字错误(在“Payment(s)”中是复数还是单数形式)?该按钮是否应该刷新面板? 假设这个假设是正确的:每次单击按钮,面板都会连同其所有内容一起刷新,从而也会刷新repeat的数据源“进入你重复的内容中。”如果refreshId不是打字错误,那么应该是什么?我试着阅读整个代码,但是代码太多了,所以我可能错过了一些东西

    广告2:这里也有类似的事情:保存按钮试图用id=“panelPayments”刷新一些东西,但我看不到任何有这个id的东西。所以难怪它看起来没有任何用处


    对于这样复杂的任务,我的建议是:试着把所有的东西都剥离到最基本的部分;代码越复杂,就越难发现错误。从一个面板、一个repeat和一些简单的控件开始,比如一个按钮和一组计算字段来显示一些测试值。然后,只要这个非常简单的模型开始工作,你就可以开始添加到它中。-简化也有助于其他人发现你的概念中的错误,顺便说一句。

    这一切都非常复杂,我还远远不能理解你在这里想要实现什么。但至少我在你的代码中发现了一些奇怪之处:

    ad 1:有一个id为=“panelPaymentContainer”的面板,其中包含一个重复项。在该重复中有一个按钮正在id=“panelPaymentsContainer”>>上执行部分刷新,这是一个打字错误(在“Payment(s)”中是复数还是单数形式)?该按钮是否应该刷新面板? 假设这个假设是正确的:每次单击按钮,面板都会连同其所有内容一起刷新,从而也会刷新repeat的数据源“进入你重复的内容中。”如果refreshId不是打字错误,那么应该是什么?我试着阅读整个代码,但是代码太多了,所以我可能错过了一些东西

    广告2:这里也有类似的事情:保存按钮试图用id=“panelPayments”刷新一些东西,但我看不到任何有这个id的东西。所以难怪它看起来没有任何用处


    对于这样复杂的任务,我的建议是:试着把所有的东西都剥离到最基本的部分;代码越复杂,就越难发现错误。从一个面板、一个repeat和一些简单的控件开始,比如一个按钮和一组计算字段来显示一些测试值。然后,只要这个非常简单的模型开始工作,你就可以开始添加到它中。-简化也有助于其他人发现您概念中的错误,顺便说一句。

    我试图简化这些错误:-)今天晚些时候我将重新编辑并扩展描述。谢谢您的输入。我要重述我的问题。我已经缩小了它的范围,它与在支付输入控件中返回pItem的自定义属性有关。我试图简化这些输入:-)我将在今天晚些时候重新编辑并扩展描述-感谢您的输入。我要重述我的问题。我已经缩小了范围,它与在Payment输入控件中返回pItem的自定义属性有关。