2012-03-02 28 views
3

我有一系列文檔的重複控制,並且在同一個面板之下但在重複控制之外,我有另一個新的綁定文檔。新文檔具有空白字段,但是在提交新文檔時,這些字段具有需要內容的驗證。在另一個數據源上更改編輯模式時,驗證器綁定到一個數據源

這是有效的。

我在重複控制的重複輸入面板上添加了一個「編輯」按鈕。操作是彈出該條目的ento編輯模式。

工作原理 - 我可以確認重複中的各行可以獨立地在編輯模式之間切換,並且在切換時,下面的新文檔不會切換。它是孤立的。

然而,

如果我在新的文檔有驗證碼,它會觸發(其中未通過驗證)上即使我切換在重複其他裝訂文檔的一個新的文檔。

我試圖確保該按鈕設置爲部分刷新,並且只設置爲刷新重複中的單個輸入面板,並且試圖確保按鈕僅綁定到正確的文檔。

它似乎只是有問題的驗證代碼,因爲如果我禁用它,所有切換都可以正常工作,並且新文檔區域不會在其目標數據庫中創建空的新文檔。

顯然我錯過了一些東西。有什麼想法嗎?

如果你想要的代碼,我已經貼了剝離,消毒,並註明版本儘可能短,我可以把它無需去除這裏的相關位:

<xp:repeat repeatControls="false" var="devices" id="ExistingDevicesList" rendered="true"> 
    <xp:this.value><![CDATA[#{javascript: /* Some script that populates the repeat */ }]]> 
    </xp:this.value> 


    <xp:panel id="IndividualDevice"> <!-- ************ start of the individual device panel --> 
    <xp:this.data> 
     <xp:dominoDocument var="devDocument" 
     databaseName=" xxxxx.nsf" action="openDocument" 
     formName="device" 
     documentId="#{javascript:devices.getDocument().getUniversalID();}" 
     ignoreRequestParams="true" /> 
    </xp:this.data> 


<!-- ******************* The Edit Button ****************** --> 

      <xp:button value="Edit" id="button1"> 
      <xp:this.binding><![CDATA[#{javascript: 
    var IndividualDevice:com.ibm.xsp.component.UIPanelEx = getComponent("IndividualDevice"); 
    IndividualDevice}]]> 
      </xp:this.binding> 

      <xp:eventHandler event="onclick" 
       submit="true" refreshMode="partial" 
       refreshId="IndividualDevice"> 
       <xp:this.action> 
       <xp:changeDocumentMode mode="edit" var="devDocument"> 
       </xp:changeDocumentMode> 
       </xp:this.action> 
      </xp:eventHandler> 
      </xp:button>    

<!-- ******************************************************* --> 

      <xp:inputText id="inputText4" value="#{devDocument.field1}" />  
      <xp:inputText id="inputText5" value="#{devDocument.field2}" /> 
    </xp:panel>  
</xp:repeat> 

<!-- ********** below is a field and button bound to the NewDevice Document --> 

<xp:inputText id="inputText3" value="#{NewDevice.field1}" 
    style="width:371.0px" required="false"> 
    <xp:this.validators> 
    <xp:validateRequired 
     message="You must enter a value." /> 
    </xp:this.validators> 
</xp:inputText>  
<xp:button value="submit new device" id="newDevButton"> 
    <xp:eventHandler event="onclick" submit="true" 
    refreshMode="partial" immediate="false" save="true" 
    refreshId="NewDevicePanel" /> 
</xp:button>  
<!-- ************************************************************************ --> 

+0

我會在這裏回答我的問題!是啊! 我穿過這裏就直接回答出來[TOMMY VALAND的博客(http://dontpanic82.blogspot.com/2010/03/xpages-making-validation-behave.html) 簡短的答案是,確認是沒有正確地綁定到與特定文檔相關的事件。也就是說,在我看來,主要和愚蠢的缺陷。 湯米描述了一個看起來不錯的工作。 – 2012-03-02 17:54:55

+0

從我所知道的來看,湯米的方法對我不起作用。它開始工作正常,但一旦驗證失敗,在前端客戶端設置標誌,該字段是無效的並且是必需的,並且不會點擊其他模式按鈕來停止客戶端驗證的發生。 盡我所知,您還必須編寫一些基於客戶端事件的代碼,以將客戶端字段中的所需標籤剝離。 我驚呆了IBM未能正確地綁定驗證事件。 – 2012-03-02 19:24:34

回答

13

嘗試addind以下設置你的編輯按鈕:

execMode =「部分」 execId =「IndividualDevice」

這將確保局部刷新只有IndividualDevice面板上,因此,在確認NewDevice數據源不運行。這對性能也會更好,因爲它減少了部分刷新正在處理的組件樹(XPage的服務器端映射)中的元素。

我能夠用代碼重現您的問題,但是當我添加上述屬性時,我能夠成功重複切換文檔。

+0

太棒了!謝謝。我迫不及待想嘗試一下。 – 2012-03-02 23:01:11

+0

OK,因此在BUTTON本身上設置execMode =「partial」execId =「IndividualDevice」並沒有這樣做,但是選擇了「[x]設置部分執行模式」。你贏得比賽的榮譽,因爲你的解釋讓我在那裏。謝謝! – 2012-03-02 23:18:25

+0

現在...去吃烏鴉。 – 2012-03-02 23:29:07

0

另一種選擇是遵循JSF(最終xPages只是JSF之上的東西)驗證表單域的方式。下面的代碼示例。對於驗證器參數,您可以使用服務器端JS或表達式語言。雖然這可能是更好的使用驗證方法,支持豆類(參見:http://www.ibm.com/developerworks/java/library/j-jsf3/

<xp:inputText value="#{document1.txtServerName}" 
    id="txtServerName1" 
    required="true" 
    validator="#{ServerBean.validateServerName}"> 
</xp:inputText> 

UPD:下面是託管bean我在示例中使用的代碼:

package test; 

import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.component.UIInput; 
import javax.faces.context.FacesContext; 

public class ServerBean { 

    public ServerBean() { 

    } 

    public void validateServerName(FacesContext context, UIComponent toValidate, 
      Object value) { 
     String serverName = (String) value; 

     if (serverName.indexOf('@') == -1) { 
      ((UIInput) toValidate).setValid(false); 

      FacesMessage message = new FacesMessage("Invalid Server Name"); 
      context.addMessage(toValidate.getClientId(context), message); 
     } 

    } 

} 
+0

我不明白這是如何解決這個問題的。 – 2012-03-02 19:25:02

+0

它可能對你有所幫助,因爲不是依靠xPages框架,而是利用JSF引擎中可用的功能,並允許更好地驗證表單中的數據。再一次,這是另一種選擇。 – 2012-03-02 19:52:33

+0

好的。我認爲,Egor,我還沒有經驗認識到,如果您的示例將被用於僅在與其綁定的特定數據源正在更新時觸發驗證事件。 Tommy的代碼確實接近了,但客戶端驗證不會與服務器端保持同步,根據我所知道的方法。 – 2012-03-02 20:24:38

1

嘗試設置用於將Doc1保存到psrtial的按鈕更新爲覆蓋Doc1字段的面板。 根據我的經驗,驗證程序只會觸發正在更新的面板中的字段。

此外,您可以隨時啓用和禁用任何驗證器。因此,對於每個驗證程序,只有在例如requestScope.doc1IsSaved爲true時纔可以啓用它們。在保存操作中,您可以在保存前將requestScope.doc1IsSaved設置爲true或false。

+0

朱利安,謝謝你。我完全按照你說的沒有任何效果(它在發佈的源代碼中)。我認爲這可能只是客戶端驗證失敗,儘管我還沒有時間來測試。 – 2012-03-02 22:31:26

相關問題