2014-02-20 67 views
1

我有一種情況,根據屏幕上其他字段的設置,此字段應允許無限選擇,3個選擇或一個選擇。是否可以在Primefaces中的p:selectManyMenu上設置選擇計數限制?

<p:selectManyMenu value="#{orderBean.selectedAddOns}"> 
    <f:selectItems value="#{catalogBean.addOns}"/> 
</p:selectManyMenu> 

因此,有10種可能的附加組件,但其中的一個選項(上面未列出的一個字段)意味着只有一個附加是允許的。另一個意味着3個被允許,並且對於任何其他選項或根本沒有選項,可以選擇任何或所有附加組件。那麼動態限制可以進行多少選擇的最直接的方法是什麼?我希望這樣,當限制爲3並且用戶選擇第四個時,它將取消選擇他們已經選擇的第一個,也就是說,如果他們選擇B,C,D,然後選擇G,則選擇變爲C, D,G如果B是他們的第一個選擇。

回答

1

我會這樣做。

<p:selectManyMenu widgetVar="selectManyMenuWV" 
        showCheckbox="true"> 
    <f:selectItem itemLabel="Option 1" itemValue="1" /> 
    <f:selectItem itemLabel="Option 2" itemValue="2" /> 
    <f:selectItem itemLabel="Option 3" itemValue="3" /> 
    <f:selectItem itemLabel="Option 4" itemValue="4" /> 
</p:selectManyMenu> 
<script>    
    $(function() { 
     selectManyMenuWV.items.on('click', function() { 
     restrictMenu($(this).text()) 
     }) 
     selectManyMenuWV.checkboxes.on('click', function() {              
     restrictMenu($(this).parent().parent().text()) 
     }) 
    }); 

    function restrictMenu(notValue) { 
     //max selection size 
     maxSelectionVar = 4; 
     if (maxSelectionVar.length != 0) { 
     if (selectManyMenuWV.input.find(':selected').length > maxSelectionVar) { 
      selectManyMenuWV.unselectItem(selectManyMenuWV.items.filter(function() {  
      if(selectManyMenuWV.input.find(':selected').eq(0).text() != notValue)           
       return $(this).text() == selectManyMenuWV.input.find(':selected').eq(0).text(); 
      else 
       return $(this).text() == selectManyMenuWV.input.find(':selected:last').text(); 
      })) 
      } 
     } 
    } 
</script> 

注:這種方法有它的缺點:

  • 它unselectes基於項目的文本。
  • 它只是客戶端,這意味着如果有人禁用/黑客的JS他將能夠選擇更多的價值。我也會在服務器端進行驗證。

一個小的工作示例可以在github找到。和一個online Demo

希望這會有所幫助。

相關問題