2

使用像 JSF 这样的基于组件的框架,可以定义一个复选框的组件:

<h:selectManyCheckbox value="#{user.favNumber1}">
    <f:selectItem itemValue="1" itemLabel="Number1 - 1" />
    <f:selectItem itemValue="2" itemLabel="Number1 - 2" />
    <f:selectItem itemValue="3" itemLabel="Number1 - 3" />
</h:selectManyCheckbox>

生成的 (x-html) 代码如下所示:

<table>
<tr>
  <td>
    <input name="j_idt6:j_idt10" id="j_idt6:j_idt10:0" value="1" type="checkbox" />
    <label for="j_idt6:j_idt10:0" class=""> Number1 - 1</label></td>
  <td>
    <input name="j_idt6:j_idt10" id="j_idt6:j_idt10:1" value="2" type="checkbox" />
    <label for="j_idt6:j_idt10:1" class=""> Number1 - 2</label></td>
  <td>
    <input name="j_idt6:j_idt10" id="j_idt6:j_idt10:2" value="3" type="checkbox" />
    <label for="j_idt6:j_idt10:2" class=""> Number1 - 3</label></td>
  <td>
</tr>
</table>

一个 Jquery 函数在一个事件(单击“按钮”)上更改此组件的状态(假设值为“1”的框):

<script>  // or in $(document).ready(){}
   $('#button').click(function(){ 
       var $checkbox = $(this).find('#j_idt6:j_idt10:0');
       $checkbox.attr('checked', !$checkbox.attr('checked'));
   });
</script>

如何通知 JSF 端客户端状态已更改。在这个级别,JSF 仍然认为复选框的值为 0,而它现在的值为 1。这会导致状态不一致......

我有什么选择?

我想到了 JSF 在其他(Rich-、Primes-、MyFaces)上的 AJAX- 支持,但我仍然愿意使用它,因为我知道要更新我的组件,因为我正在构建一个具有许多功能的富客户端(显示操作、Jquery UI 小部件、Web 远程处理、动态行为、Web 服务、视觉效果等)。DOM 客户端状态应该被大量操作,而 Jquery 是必须的……所以它不能被搁置一旁。

谢谢!

4

1 回答 1

4

由于您使用的是 JSF2,因此您应该使用f:ajax(谷歌有关它的更多信息)

像这样(在你的情况下不需要jquery)

<h:selectManyCheckbox value="#{user.favNumber1}">
    <f:selectItem itemValue="1" itemLabel="Number1 - 1" />
    <f:selectItem itemValue="2" itemLabel="Number1 - 2" />
    <f:selectItem itemValue="3" itemLabel="Number1 - 3" />
    <f:ajax listener="#{user.someMethod}" />
</h:selectManyCheckbox>

你的user豆子在哪里

public void someMethod(AjaxBehaviorEvent ev) {
    System.out.println(favNumber1);
}
于 2012-07-12T11:32:55.550 回答