【问题标题】:Xpage Custom Control / Repeaters Data Save IssueXpage 自定义控件/中继器数据保存问题
【发布时间】:2014-05-05 15:05:23
【问题描述】:

这是我之前问过 last week 的问题的延续。

我有一个 XPage。在这个 XPage 上,我有一个中继器。在这个转发器中,我有一个自定义控件,用于显示它自己的数据源的内容——一个 NotesXspDocument。这种控制重复 5 到 10 次,可能最多 15 次。我不想让用户为每个重复的控件按下保存,所以我使用了上面链接问题中描述的提交按钮功能。

当用户按下提交按钮时,我在事件选项卡上使用 querySaveDocument 和 postSaveDocument 操作(我还在数据选项卡中尝试了具有相同结果的同名属性)。我的问题如下:

验证一个接一个地执行,直到验证失败立即保存数据源,然后继续下一个实例。保存新文档时,XspDocument 似乎消失了,字段也被清空了。我已经检查过了,我已经将数据源范围设置为查看,因为这种行为在某种程度上类似于 requestScope。一旦我重新加载页面,信息就会正确显示。

我可以使用“context.reloadPage()”来获取更新的信息,但这会带来令人讨厌的副作用,即删除所有未保存的信息(例如,如果在第 x 行验证失败)。我怎样才能最好地解决/解决这个问题?我应该注意什么?有没有其他人见过这样的行为?

我很想对 Containing XPage 中的所有行调用验证函数,然后如果所有行都成功,则调用 saveDataSources 函数。任何帮助是极大的赞赏!

【问题讨论】:

    标签: xpages lotus-notes


    【解决方案1】:

    重复控制之外的一个简单按钮就可以了。我创建了这个例子:

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    
        <xp:repeat id="repeat1" rows="30" value="#{javascript:4}">
            <xp:panel id="dataPanel" disableOutputTag="true">
                <xp:this.data>
                    <xp:dominoDocument var="document1" formName="Demo2">
                    </xp:dominoDocument>
                </xp:this.data>
                <xp:table>
                    <xp:tr>
                        <xp:td>
                            <xp:label value="Subject!" id="subject_Label1" for="subject1">
                            </xp:label>
                        </xp:td>
                        <xp:td>
                            <xp:inputText value="#{document1.Subject}"
                                id="subject1" required="true">
                                <xp:this.validators>
                                    <xp:validateRequired
                                        message="Say something">
                                    </xp:validateRequired>
                                    <xp:validateLength minimum="5"
                                        message="Say 5 characters or more">
                                    </xp:validateLength>
                                </xp:this.validators>
                            </xp:inputText>
                        </xp:td>
                    </xp:tr>
                    <xp:tr>
                        <xp:td>
                            <xp:label value="Color!" id="color_Label1" for="color1">
                            </xp:label>
                        </xp:td>
                        <xp:td>
                            <xp:comboBox value="#{document1.Color}"
                                id="color1" defaultValue="red">
                                <xp:this.validators>
                                    <xp:validateExpression
                                        message="We don't like red">
                                        <xp:this.expression><![CDATA[#{javascript:value != "red"}]]></xp:this.expression>
                                    </xp:validateExpression>
                                </xp:this.validators>
                                <xp:selectItem itemLabel="red"></xp:selectItem>
                                <xp:selectItem itemLabel="yellow"></xp:selectItem>
                                <xp:selectItem itemLabel="green"></xp:selectItem>
                                <xp:selectItem itemLabel="blue"></xp:selectItem>
                                <xp:selectItem itemLabel="white"></xp:selectItem>
                                <xp:selectItem itemLabel="black"></xp:selectItem>
                            </xp:comboBox>
                        </xp:td>
                    </xp:tr>
                </xp:table>
            </xp:panel>
        </xp:repeat>
    
        <xp:messages layout="table" style="color:red" id="messages1">
        </xp:messages>
    
        <xp:button value="Save?" id="button1">
            <xp:eventHandler event="onclick" submit="true"
                refreshMode="complete" immediate="false" save="true"></xp:eventHandler>
        </xp:button>
    
    </xp:view>
    

    除非满足所有验证,否则它不会保存任何数据,也不会删除任何输入的数据。不要进入 XPages 自动执行的方式(您也不要将猫刷到她的皮毛上)。您的验证应该在验证器中进行,并通过按钮保存数据源。如您所见:此处不需要 Query/Post 事件代码。

    【讨论】:

    • 所以基本上,我想多了,让它变得比需要的更复杂。 ;) 谢谢你的回答!我会试一试的。
    【解决方案2】:

    我真的不明白你想要做什么,所以我只会评论一篇文章。 如果您希望数据在 context.reloadPage() 中存活,我认为您需要将控件绑定到 sessionScope。 ViewScope 可能在重新加载期间被清除,但 sessionScope 应该仍然可用。

    祝你好运!

    【讨论】:

    • 基本上,我的目标是创建一个自定义控件,就像在 OOP 中创建任何类一样。我想创建一个控件,它定义了自己的组件和结构(文本框等),组织了这些组件,然后允许内部定义的方法,无论是在 java 还是 javascript 中执行,都可以由托管 xpage 调用。我想轻松创建自己的 XPage 控件,这些控件很可能使用背景文档或(将来)可能使用 sql 数据。我想在创建自定义控件时使用面向对象的理论。这似乎是不可能的。
    猜你喜欢
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多