2012-01-06 84 views
4

這種奇怪的行爲只發生在Firefox(特別是Firefox 8)中。所以我有一個dataTable,我可以做multiple selection。一個提交按鈕,將顯示一個選定項目的列表dataListdialog。如果用戶沒有選擇任何東西,那麼會有一個錯誤消息要求用戶選擇一些東西。如果用戶不選擇任何內容,對話框將不會出現。下面的代碼完成了這一切。但是火狐如果你做這些後續會出現很奇怪:即使在刷新頁面之後,Firefox仍保留JSF-Viewscoped-Managed-Bean內數組的內容

  1. 單擊以選中的dataTable
  2. 一個項目,然後刷新(F5或CTL + R)的頁面(你可以看到選擇了清客)
  3. 然後點擊提交,它顯示我剛剛選擇的任何東西。

這是出乎意料的,因爲刷新應該清除您剛選擇的任何因爲@ViewScoped bean的性質。這種行爲只發生在Firefox中。 IE 8對我來說行爲正確。這是一個錯誤,還是我在這裏做錯了什麼?

鑽嘴魚科2.1 + PrimeFaces3.0決賽+ Tomcat的7

更新:我做了一些調試,當我刷新,數組selectedFoods成爲null的價值,但對於一些奇怪的原因,當頁它得到public void checkSelection(),它保存了先前選擇的值。很奇怪。

這是我的代碼。

<p:growl id="messages" showDetail="true" /> 
<p:messages id="msgs"/> 
<h:form id="form"> 
    <p:dataTable value="#{viewBean.foodList}" var="item" 
        selection="#{viewBean.selectedFoods}" 
        selectionMode="multiple" 
        rowKey="#{item}"> 
     <p:column> 
      #{item} 
     </p:column> 
     <f:facet name="footer"> 
      <p:commandButton value="Submit" update=":form:display :dataList" 
           action="#{viewBean.checkSelection}"/> 
     </f:facet> 
    </p:dataTable> 
    <p:dataList id="display" value="#{viewBean.selectedFoods}" var="item" 
        itemType="disc"> 
     #{item} 
    </p:dataList> 
</h:form> 
<p:dialog id="dialog1" widgetVar="dialog1" dynamic="true" width="200"> 
    <p:dataList id="dataList" value="#{viewBean.selectedFoods}" var="item" 
        itemType="disc"> 
     #{item} 
    </p:dataList> 
</p:dialog> 

這裏是我的託管bean

@ManagedBean 
@ViewScoped 
public class ViewBean implements Serializable { 
    private List<String> foodList; 
    private String[] selectedFoods; 

    @PostConstruct 
    public void init() { 
     foodList = new ArrayList<String>(); 
     foodList.add("Pizza"); 
     foodList.add("Pasta"); 
     foodList.add("Hamburger"); 
    } 

    public void checkSelection(){ 
     RequestContext requestContext = RequestContext.getCurrentInstance(); 
     if(selectedFoods.length > 0){ 
      requestContext.execute("dialog1.show()"); 
     }else{ 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Error", "Please select")); 
      requestContext.addPartialUpdateTarget("messages"); 
     } 
    } 
    //setter, getter 
} 
+0

:P如果你的代碼可以在某些瀏覽器上正常運行,我會說你沒有做錯任何事。如果你的服務器端代碼出錯了,它會出現在所有瀏覽器上^^ – 2012-01-06 20:58:05

+0

@ Mr.J4mes:D我想知道你是否產生了和我一樣的結果? – 2012-01-06 21:13:40

+0

我還沒有試過,但我會遲一點:P – 2012-01-06 21:21:42

回答

1

你的代碼是正確的。你所看到的是因爲某些應該是Firefox的功能(我能夠在FF4上重現這一點)。 p:dataTable的選擇模型是使用隱藏表單字段實現的。重新加載頁面時,Firefox會嘗試保存並恢復已更改的表單域值,以免丟失輸入內容。您可以通過將<h:inputText/>添加到您的視圖中,在輸入中輸入內容並重新加載來觀察此情況。

我不確定Firefox團隊是否適用於隱藏表單域,但我認爲他們確實有很好的機會。我打算用Primefaces提交一個錯誤報告,以初始化隱藏的輸入或讀取負載上的輸入以使p:dataTable選擇匹配。任一解決方案都應導致渲染選擇和隱藏選擇模型同步。

+0

非常感謝您的解釋。如果您可以向PrimeFaces提交錯誤報告,我將非常感激。 – 2012-01-09 14:13:35

+0

啊對,該字段應該有'autocomplete =「off」'。 @哈里:你也可以在http://code.google.com/p/primefaces/issues/ – BalusC 2012-01-09 14:14:46

+0

上報告自己,我去報告這個報告,它想要一個論壇主題來引用,所以我在那裏發佈:http: //forum.primefaces.org/viewtopic.php?t=17425。我必須瞭解更多關於自動完成的信息,因爲聽起來這可能是正確的解決方案。 – Brian 2012-01-09 14:39:07

相關問題