我會這樣做。
<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。
希望這會有所幫助。