2013-04-24 56 views
2

我有一個數據表,其中每行有24個小時的輸入字段。在某個時間點,有超過1000個可編輯的輸入字段。我注意到,在ajax調用期間使用p:cellEditor時,primefaces正在提交整個數據表。我怎樣才能避免這種情況? 請在下面找到我所擁有的代碼,並在其中找到對其中每個重要部分的評論。Primefaces cellEditor在ajax中傳遞整個數據表提交

 <!-- Fires the cellEdit event to trigger the validations to happen as user tabs out of the input box --> 
    <p:ajax event="cellEdit" listener="#{renderValidator.onCellEdit}" update=":#{p:component('globalMessages')}" process="@this" /> 

    <p:column id="hour1" styleClass="col-right col-90"> 
     <f:facet name="header"> 
      <h:outputText value="1" escape="false"/> 
     </f:facet> 
     <p:cellEditor > 

      <f:facet name="output"> 
      <h:outputText value="#{row.amount[0]}" escape="false"> 
      <f:convertNumber maxFractionDigits="3" minFractionDigits="3" maxIntegerDigits="5" /> 
      </h:outputText> 
      </f:facet> 
      <f:facet name="input"> 
      <p:inputText id="hour1Input" value="#{row.amount[0]}" maxlength="10" size="10" readonly="#{row.readOnly}" onchange='PowerMeter.setPowerMeterChange()' 
      styleClass="col-right" valueChangeListener="#{row.setDirtyFlag(true)}" > 
      <!-- formats data the way its displayed --> 
      <f:convertNumber maxFractionDigits="3" minFractionDigits="3" maxIntegerDigits="5" /> 
      <!-- validates the input value w.r.t a custom validator --> 
      <f:validator validatorId="hourlyValueValidator" for="hour1Input" /> 
      <!-- javascript restricting user to input alpha numeric characters --> 
      <pe:keyFilter testFunction="return PowerMeter.isValidMWH(this, c);" /> 
      </p:inputText> 
      </f:facet>   
     </p:cellEditor> 
    </p:column> 
+0

Durng Ajax調用驗證,我寧願只是通過特定的輸入文本。我嘗試用id'hour1Input'替換@this,但仍然在chrome中,我可以看到整個表正在提交。 – Sabarish 2013-04-24 21:25:37

+0

如何嘗試[懶惰加載](http://www.primefaces.org/showcase/ui/datatableLazy.jsf)?或者,celleditor可以實現您自己的按鈕。那個不是一件容易的事。 – 2013-04-24 21:27:54

回答

2

在Ajax請求上,JSF默認發送表單中所有輸入組件的數據。即使在部分生命週期中僅執行了100個組件中的一個。隨着PrimeFaces你可以通過這樣的設置partialSubmittrue改變這種現象:

<p:ajax partialSubmit="true" event="cellEdit" process="@this" 
    listener="#{renderValidator.onCellEdit}" 
    update=":#{p:component('globalMessages')}"/> 
+0

試過@Michi仍然提交了整個輸入字段。我必須限制這種行爲,因爲它引發了一個非法狀態異常'超過了單個請求([512])的最大請求參數數量(GET + POST)'「。雖然我知道這方面的工作,但我更願意在ajax級別處理它,並且不要讓Ajax通過所有未觸及的變量。 – Sabarish 2013-04-25 13:38:21

+0

你使用哪個版本的PrimeFaces?我不知道何時添加了部分提交功能。 – Michi 2013-04-26 09:20:49

+0

primefaces 3.5.2 – Sabarish 2013-04-26 14:06:20

0

Primefaces使用PrimeFaces.ajax.AjaxUtils.send功能構建Ajax請求。要確定需要發送到服務器的數據,它使用jQuery find函數,然後serializeArray用於構建POST請求。

componentPostParams = jqProcess.find(':input').serializeArray(); 

不幸的是,當liveScroll屬性爲<p:DataTable>啓用,已經有進賬,將處理所有輸入控件不管<p:cellEditor>只有一個輸入面上可見的數據量巨大。

Data table with only one input element visible

要改變這個功能我在下面的表格推翻PrimeFaces.ajax.AjaxUtils.send功能

var pFacesSend = PrimeFaces.ajax.AjaxUtils.send; 
PrimeFaces.ajax.AjaxUtils.send = function(cfg) { 
    if (myCase) { 
     // Custom send 
    } else { 
     pFacesSend(cfg); 
    } 
}; 

而在myCase我改變了這個額外的序列:

componentPostParams = jqProcess.find(':input').serializeArray(); 

進入這個:

if (!customSerializationCondition) { 
    componentPostParams = jqProcess.find(':input').serializeArray(); 
} else { 
    componentPostParams = jqProcess.find(':input').filter(function() { 
     return $(this).parent().css('display') !== 'none'; 
    }).serializeArray(); 
} 

該解決方案建立一個POST請求只包括可見輸入字段,並且因爲我的編輯模式的設置爲細胞我只有一個<input>可見。 它適用於Primefaces v4.0,只要輸入父標記使用css display屬性在編輯器中隱藏輸入構面,就應該可以工作。