2014-07-16 58 views
0

有一個required字段:的XPages驗證

<xp:this.validators> 
          <xp:validateRequired 
           message="Required field. Please add some text."> 
          </xp:validateRequired> 
</xp:this.validators> 

另外,從該字段的值被複制(使用onChange事件)發送給其他字段:

 <xp:eventHandler event="onchange" submit="true"refreshMode="norefresh"> 
      <xp:this.action><![CDATA[#{javascript:Cdoc.setValue("dlg_Localitate",Cdoc.getValue("txt_LocalitateCompanie")); 
     Cdoc.setValue("dlg_Localitate_1",Cdoc.getValue("txt_LocalitateCompanie"))}]]>                     
     </xp:this.action> 
    </xp:eventHandler> 

的不便的問題出現時,我只需點擊該字段填寫它:驗證消息出現。是因爲該字段最初是空的,我添加的代碼是在onChange事件?

我希望在用戶保存文檔之前根據需要使用此字段。

我試圖通過CSJS設置的值,但沒有結果......

var string = XSP.getElementById("#{id:inputText1}").value 
XSP.getElementById("#{id:txt_LocalitateS}").value = string 
XSP.getElementById("#{id:txt_LocalitateP}").value = string 

此外,讓說,我輸入一個值inputText1,後來我進入一個新的價值... ...我怎麼能用新值自動更新其他2個字段?

我想是這樣的:

<xp:inputText id="inputText1" value="#{Cdoc.txt_LocalitateCompanie}" 
         style="height:20.0px;width:122.0px;font-weight:bold;font-size:10pt;font-family:verdana" 
         required="true"> 


         <xp:this.validators> 
          <xp:validateRequired message="Completarea localitatii este obligatorie."> 
          </xp:validateRequired> 
         </xp:this.validators> 
         <xp:typeAhead mode="full" minChars="1" ignoreCase="true" 
          id="typeAhead1"> 
          <xp:this.valueList><![CDATA[#{javascript:@DbLookup(@DbName(),"vwLocalitati",Cdoc.txt_LocalitateCompanie,1,"[PARTIALMATCH]");}]]></xp:this.valueList> 
         </xp:typeAhead> 
         <xp:eventHandler event="onchange" submit="true" 
          refreshMode="norefresh"> 
          <xp:this.action><![CDATA[#{javascript:Cdoc.setValue("dlg_Localitate",Cdoc.getValue("txt_LocalitateCompanie")); 
Cdoc.setValue("dlg_Localitate_1",Cdoc.getValue("txt_LocalitateCompanie"))}]]></xp:this.action> 

          <xp:this.script><![CDATA[XSP.partialRefreshGet("#{id:txt_LocalitateS}", { 
    onComplete: function() { 
     XSP.partialRefreshGet("#{id:txt_LocalitateP}", { 
      onComplete: function(){ } 
     }); 
    } 
});]]></xp:this.script> 
         </xp:eventHandler> 
        </xp:inputText> 

在此先感謝

+0

是否可以在自定義querySave操作中設置這些字段?由於性能和用戶體驗,onChange事件通常是不好的做法。 – Greg

+0

@Greg我也考慮過你的建議。我看到了一個很大的缺點:這些字段(我設置值的地方)是可編輯的,用戶需要的是:在填充'required'字段後,立即用相應的值設置這些字段。這幾乎就像來自Lotus Notes的'關鍵字更改刷新字段'。 –

+0

如果您正在使用組合框/類似列出的控件,將其保留在onChange()中並不那麼顯着。我只想快速測試,如果刪除onChange代碼可以解決問題,因爲這很容易測試。很多人可能會遇到的一個解決方案,那就是使用更新按鈕。這樣的事情也會限制已經存在的信息被無意刪除的危險。 – Greg

回答

1

這裏有兩件事。首先,您應該禁用onChange事件的驗證器,因此它不會顯示驗證錯誤。其次,當你使用CSJS腳本和SSJS一起使用時,它將觸發CSJS腳本,如果它返回true,則繼續使用SSJS。因此,如果您希望您的CSJS代碼在 SSJS之後運行,則可以將其放入oncomplete

如果我正確理解你的問題,下面的代碼將解決它。

<xp:inputText 
     id="inputText1" 
     value="#{Cdoc.txt_LocalitateCompanie}" 
     style="height:20.0px;width:122.0px;font-weight:bold;font-size:10pt;font-family:verdana" 
     required="true"> 
     <xp:this.validators> 
      <xp:validateRequired 
       message="Completarea localitatii este obligatorie."> 
      </xp:validateRequired> 
     </xp:this.validators> 
     <xp:typeAhead 
      mode="full" 
      minChars="1" 
      ignoreCase="true" 
      id="typeAhead1"> 
      <xp:this.valueList><![CDATA[#{javascript:@DbLookup(@DbName(),"vwLocalitati",Cdoc.txt_LocalitateCompanie,1,"[PARTIALMATCH]");}]]></xp:this.valueList> 
     </xp:typeAhead> 
     <xp:eventHandler 
      event="onchange" 
      submit="true" 
      refreshMode="norefresh" 
      disableValidators="true"> 
      <xp:this.action><![CDATA[#{javascript:Cdoc.setValue("dlg_Localitate",Cdoc.getValue("txt_LocalitateCompanie")); 
Cdoc.setValue("dlg_Localitate_1",Cdoc.getValue("txt_LocalitateCompanie"))}]]></xp:this.action> 
      <xp:this.onComplete><![CDATA[if(dojo.byId("#{id:txt_LocalitateP}")) { 
XSP.partialRefreshGet("#{id:txt_LocalitateP}", { 
    onComplete: function() { 
     XSP.partialRefreshGet("#{id:txt_LocalitateS}", { 
      onComplete: function(){ } 
     }); 
    } 
}); 
}]]></xp:this.onComplete> 
     </xp:eventHandler> 
    </xp:inputText> 

UPDATE:在你的情況,你要刷新域與partialRefresh="true"第二個選項卡上。這意味着在partialRefreshGet時,目標字段可能不存在於DOM中。我已經添加了一張支票。

+0

它的工作原理,但當我第一次完成該領域時,我得到一個錯誤:沒有提交與id視圖的元素:_id1:_id2:_id44:djContentPane1:djTabPane2:txt_LocalitateS –

+0

txt_LocalitateS在不同的選項卡上我猜,對嗎?如果該選項卡未被選中,則它將不可用於CSJS。因此你不能刷新它的一部分。事實上,你不需要刷新它。因爲當用戶切換到另一個選項卡時,他/她會看到更新的值。 –

+0

是的,但即使txt_LOcalitateP在不同的選項卡上。如果沒有值不會傳遞... –

0

這是從我的意見取出並放入一個答案:

的onChange事件通常不贊成由於性能和用戶體驗。但是,如果該字段是列出的控件,即組合框,它並不那麼顯着。以下選項/想法可用

  1. 取出onChange()以測試是否有所作爲。如果是這樣,請移動您的代碼。
  2. 使用更新按鈕來更改已從輸入的集體也防止信息的所有字段被刪除不想要的LY
  3. 創建自己的驗證方法和顯示/手動隱藏標籤(破解-Y)
  4. 研究如何手動放置文本的誤差控制
  5. 如果該字段是在對話框中,移動的onChange()到對話框

進一步編輯 一個想法的開/關中的方法我可能 建議使用xspDoc.getDocument(true)方法將xpage的所有更改推送到後臺文檔。有些東西告訴我,這可能會影響服務器讀取文檔的更改並意識到它不是空的。

更多的想法
我沒有提到這一點,因爲它更先進一些,但也應該把工作假設刷新的完成工作。即使這不是什麼大問題。您可以將文檔中的所有數據讀取到Java bean中。這個bean然後是你的頁面的「數據源」,你將所有的控件綁定到這個bean的屬性上。然後,您將使用EL將您的控件綁定到bean。在觸發其他字段中變化的那些變量的設置器中,更改這些值。所以,

public PageBean(){ 
    //read connection information out of the URL and get the correct information out of the document 
    //set all variables 
    firstName=doc.getItemValueString("firstName"); 
} 

private String firstName; 
public String getFirstName(){ 
    return firstName; 
} 
public void setFirstName(String firstName){ 
    this.firstName = firstName; 
    setLastName("Schmidt"); 
} 
.... 

一旦你註冊faces-config.xml中你的bean,然後你可以使用EL訪問數據

#{PageBean.firstName} 
#{PageBean.lastName} 

然後,您可以再次保存您的文檔,並重置價值,保存併發布。

+0

在我的問題中描述的字段不在對話框控件中。他們在同一個Xpage上。 –

+0

該字段是editBox(es)。 –