2014-10-06 11 views
0

我有一個需要組合框「PriceList」與顯示錯誤控制相關聯。顯示錯誤控制只能工作一次

我有一個OnChange事件的「價格」字段,用於設置「價格表」所需的屬性。如果輸入價格,則「價格表」組合框要求將屬性設置爲false,否則爲空白,則啓用「價格表」。

這兩個字段和xpage都禁用了客戶端驗證。

當創建文檔時,combox會在開始時顯示錯誤消息。如果我更改並刪除了「價格」的值,則「價格表」的錯誤控制不會顯示消息,但所需的屬性爲真。

這裏有什麼問題?

價格表代碼:

<xp:comboBox 
           id="comboBox7" 
           value="#{document1.PList1}" 
           style="width:99.0px" 
           disableClientSideValidation="true"> 
           <xp:this.validators> 
            <xp:validateRequired 
             message="Required"> 
            </xp:validateRequired> 
           </xp:this.validators> 
           <xp:this.required><![CDATA[#{javascript:var price11:com.ibm.xsp.component.xp.XspInputText = getComponent("price11"); 
var a=price11.getValueAsString() 
if (a == ""){ 
    return true; 
    }else{ 
    return false; 
    }}]]></xp:this.required> 
           <xp:this.disabled><![CDATA[#{javascript:var price11:com.ibm.xsp.component.xp.XspInputText = getComponent("price11"); 
var a=price11.getValueAsString(); 
if (a==""){ 
    return false; 
    } else { 
    return true; 
    }}]]></xp:this.disabled> 
           <xp:selectItems> 
            <xp:this.value><![CDATA[#{javascript:var result = []; 
var pricelist = @DbLookup("" , "Keywords","Price List", 2) 
result.push("") 
for (var i = 0; i < pricelist.length; i++) { 
    var eachName = pricelist[i]; 
    result.push(eachName); 
} 
return result;}]]></xp:this.value> 
           </xp:selectItems> 
          </xp:comboBox> 

價格代碼:

<xp:inputText 
           value="#{document1.Price1}" 
           id="price11" 
           style="width:80px" 
           required="true" 
           disableClientSideValidation="true"> 
           <xp:this.validators> 
            <xp:validateRequired 
             message="Required field"> 
            </xp:validateRequired> 
           </xp:this.validators> 

          <xp:eventHandler event="onchange" submit="true" refreshMode="complete"> 
           <xp:this.action> 
            <xp:executeScript> 
             <xp:this.script><![CDATA[#{javascript:var comboBox7:com.ibm.xsp.component.xp.XspSelectOneMenu = getComponent("comboBox7"); 
var price11:com.ibm.xsp.component.xp.XspInputText = getComponent("price11"); 
var a=price11.getValueAsString(); 
if(a !==""){ 
     //if(comboBox7.isRequired()==true){ 
     //comboBox7.setRequired(false); 
     //} 
     //var result = []; 
     //var pricelist = @DbLookup("" , "Keywords","Price List", 2) 
     //result.push("") 
     //for (var i = 0; i < pricelist.length; i++) { 
      //var eachName = pricelist[i]; 
      //result.push(eachName); 
      //} 
     //comboBox7.setValue(result); 
     comboBox7.setRequired(false); 
     comboBox7.setDisabled(true); 
     } else { 
     comboBox7.setDisabled(false); 
     comboBox7.setRequired(true); 
     } 

     }]]></xp:this.script> 
            </xp:executeScript> 
           </xp:this.action></xp:eventHandler></xp:inputText> 
+0

與數據交談!與其試圖獲取組合框並對其進行更改,不如使用任何要改變所需屬性的方法設置的範圍變量。 – stwissel 2014-10-07 00:00:58

回答

0

我建議使用SSJS調試器或打印語句制定出這裏發生了什麼。代碼看起來非常複雜。首先,你的代碼將ComboBox上的setRequired設置爲true或false。但是隻有通過驗證才能運行。它也會進行全面刷新,因此看起來您正在重新加載頁面。此外,您正在計算組合框上的必需屬性,因此即使您進行了部分刷新並將其設置爲需要與否,RenderResponse階段也會重新計算所需屬性並覆蓋由onChange事件設置的任何狀態。殘疾人財產也是如此。

如果您根據需要設置了組件,那麼將會發生該刷新的驗證。所以只有在下次用戶提交頁面時才需要。此時驗證將失敗,因此除非您禁用驗證器,否則不能將其設置爲禁用。但是,在用戶輸入值之前,禁用驗證器是在服務器端完成的。

我的建議是將您的驗證移動到您的保存方法,並從底層數據源而不是組件進行工作。如果你想標記組件是否有效,那麼就有一個setValid()方法,並且有一些關於添加一個FacesMessage的博客文章來指出錯誤並將它綁定到一個組件。

對於更高級的方法,Tim Tripcony做了一個關於使用綁定屬性鏈接組件以進行這種相關驗證的NotesIn9。但是這需要Java。