XPages Ext Lib对话框控件字段不可编辑,需要获取字段值的句柄,并关闭对话框

时间:2013-03-02 19:35:32

标签: xpages xpages-extlib

我的XPage上有一个扩展库对话框控件,它通过一个按钮打开:

XSP.openDialog("#{id:commentsDialog}");

在我的XPage上,我有一个名为document1的文档源。当我将这些字段(从Data Palette中拖放)放在对话框控件上时,字段(docID)存在,但不可编辑 - 看起来为显示计算:

<xe:dialog id="commentsDialog" title="Comments" styleClass="dialogBoxComments">
    <xp:panel>
        <xp:table style="width:100%">
            <xp:tr>
                <xp:td>
                    <xp:label value="Enter your comments..." id="label2"></xp:label>
                </xp:td>
            </xp:tr>
            <xp:tr>
                <xp:td>
                    <xp:inputTextarea id="comments" style="width:100%;height:100px">
                    </xp:inputTextarea>
                </xp:td>
            </xp:tr>
            <xp:tr>
                <xp:td>
                    <xp:div style="text-align:right">
                        <xp:button value="Submit" id="submitButton">
                            <xp:eventHandler event="onclick" submit="true"
                                refreshMode="complete">
                                <xp:this.action><![CDATA[#{javascript:saveComments();}]]></xp:this.action>
                            </xp:eventHandler>
                        </xp:button>
                        <xp:button id="cancelButton" value="Cancel">
                            <xp:eventHandler event="onclick" submit="false">
                                <xp:this.script><![CDATA[XSP.closeDialog("#{id:commentsDialog}");]]></xp:this.script>
                            </xp:eventHandler>
                        </xp:button>
                    </xp:div>
                </xp:td>
            </xp:tr>
            <xp:tr>
                <xp:td>
                    <xp:inputText value="#{document1.docID}" rendered="false"
                        id="docID"></xp:inputText>
                </xp:td>
            </xp:tr>
        </xp:table>
    </xp:panel>
    <xp:br></xp:br>
</xe:dialog>

我有一个输入文本区域,用户将在其中输入值,但我无法使用SSJS获取该值。我试过了:

    function getComponentValue(id){
      var field = getComponent(id);
      var value = field.getSubmittedValue();
      if( null == value ){
         // else not yet submitted
         value = field.getValue();
      }
      return value
    }

要获取输入文本区域中的值,我不知道该怎么做,因为如果我绑定到Data Palette中的现有字段,它看起来是不可编辑的,我不能输入任何值。

另外,我在对话框控件上有一个Submit按钮,它调用了一些SSJS:

function saveComments() {
// Need to create a comments doc for the movie...
var db:NotesDatabase = session.getCurrentDatabase();
var doc:NotesDocument = currentDocument.getDocument();
var unid = getComponentValue("docID");
// Grab comments from dialog...
var comments = getComponentValue("comments");
// Create the comments doc...   
var docComm:NotesDocument = db.createDocument();
docComm.replaceItemValue("Form", "comment");    
var nowValue = @Text(@Now());
var currentUser = sessionScope.get("currentUser");
docComm.replaceItemValue("cm_Key", unid);
docComm.replaceItemValue("cm_By", currentUser);
docComm.replaceItemValue("cm_Date", nowValue);
docComm.replaceItemValue("cm_Key", unid);
docComm.save();
}

如何从服务器端关闭Dialog?

所以,3件事(感谢你的耐心):

  1. 如何在对话框控件上编辑字段
  2. 如何从未绑定到document1上的字段的输入文本区域获取值
  3. 如何从服务器端关闭对话框
  4. 谢谢!


    编辑: 我在此评论中进行了编辑,因此我可以正确显示图像...

    1. 我使docID字段可见,它显示为计算,不可编辑。
    2. 我添加了第二个文档数据源(commentDocument)并将字段的值设置为数据调色板值 - 字段未显示,认为它可能是不可编辑的。
    3. 这是图像 - 绿色框是注释字段(来自commentsDocument源的cm_Comm)应存在的位置,红色框是不可编辑的docID字段: Fields not editable on dialog control

      以下是控件背后的代码:

      <xe:dialog id="commentsDialog" title="Comments" styleClass="dialogBoxComments">
          <xp:panel>
              <xp:table style="width:100%">
                  <xp:tr>
                      <xp:td>
                          <xp:label value="Enter your comments..." id="label2"></xp:label>
                      </xp:td>
                  </xp:tr>
                  <xp:tr>
                      <xp:td>
                          <xp:inputTextarea id="comments" style="width:100%;height:100px"
                              value="#{commentDocument.cm_Comm}">
                          </xp:inputTextarea>
                      </xp:td>
                  </xp:tr>
                  <xp:tr>
                      <xp:td>
                          <xp:div style="text-align:right">
                              <xp:button value="Submit" id="submitButton">
                                  <xp:eventHandler event="onclick" submit="true"
                                      refreshMode="complete">
                                      <xp:this.action><![CDATA[#{javascript:saveComments();getComponent("commentsDialog").hide();}]]></xp:this.action>
                                  </xp:eventHandler>
                              </xp:button>
                              <xp:button id="cancelButton" value="Cancel">
                                  <xp:eventHandler event="onclick" submit="false">
                                      <xp:this.script><![CDATA[XSP.closeDialog("#{id:commentsDialog}");]]></xp:this.script>
                                  </xp:eventHandler>
                              </xp:button>
                          </xp:div>
                      </xp:td>
                  </xp:tr>
                  <xp:tr>
                      <xp:td>
                          <xp:inputText value="#{document1.docID}" id="docID"></xp:inputText>
                      </xp:td>
                  </xp:tr>
              </xp:table>
          </xp:panel>
          <xp:br></xp:br>
      </xe:dialog>
      

      请让我知道我在做什么 - 感谢这一点!

2 个答案:

答案 0 :(得分:4)

如何在对话框控件上编辑字段

  1. 为inputTextarea添加一个value属性 - 例如一个viewScope变量(value="#{viewScope.myTextArea}"),以便XPages(JSF)可以在以后要处理的文本区域中存储内容

  2. 您的inputText字段设置为rendered="false"。首先设置要渲染的控件(因此删除rendered =“false”属性)。

  3. 如何从输入文本区域获取未绑定到document1上字段的值

    见上面的答案1.

    如何从服务器端关闭对话框

    使用getComponent("commentsDialog").hide()

答案 1 :(得分:1)

使用var“comment”创建第二个DominoDocument数据源。将其范围设置为“请求”。为cm_Key,cm_By和cm_Date创建隐藏的输入组件,为每个组件设置适当的defaultValue; e.g:

<xp:inputHidden value="#{comment.cm_By}" defaultValue="#{context.user.distinguishedName}" />

然后您可以将对话框字段绑定到该数据源:

<xp:inputTextarea id="comments" style="width:100%;height:100px" value="#{comment.cm_Comment"}>

因此,您的提交按钮可以成为“保存文档”简单操作和单行“执行脚本”:

<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    <xp:this.action>
        <xp:actionGroup>
            <xp:actionGroup>
                <xp:saveDocument var="comment" />
                <xp:executeScript>
                    <xp:this.script><![CDATA[#{javascript:getComponent("commentsDialog").hide();}]]></xp:this.script>
                </xp:executeScript>
            </xp:actionGroup>
        </xp:actionGroup>
    </xp:this.action>
</xp:eventHandler>

如果注释数据源的范围限定为每个请求,则每次都会创建一个新文档。您不需要以编程方式创建文档...让数据源为您管理。