Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf h:SelectOne菜单值更改事件在h:commandButton上触发单击?_Jsf_Seam - Fatal编程技术网

Jsf h:SelectOne菜单值更改事件在h:commandButton上触发单击?

Jsf h:SelectOne菜单值更改事件在h:commandButton上触发单击?,jsf,seam,Jsf,Seam,我有下面的下拉列表,其中有一个与之关联的事件,当用户从该下拉列表中选择一个值时,其余的下拉列表以及一个表将相应地填充: <Td> <h:selectOneMenu id="combocarList" value="#{customerBean.selectedcar}" styleClass="comboStyle" valueChangeListener="#{customerBean.loadothercombos}" onch

我有下面的下拉列表,其中有一个与之关联的事件,当用户从该下拉列表中选择一个值时,其余的下拉列表以及一个表将相应地填充:

 <Td>
 <h:selectOneMenu id="combocarList" 
     value="#{customerBean.selectedcar}"
     styleClass="comboStyle"
     valueChangeListener="#{customerBean.loadothercombos}"
     onchange="document.forms[0].submit()"
 >
     <f:selectItem
    itemLabel="-----------Select--------------"
    itemValue="None" />
      <f:selectItems value="#{customerBean.carsList}" />
   </h:selectOneMenu>
  </Td>

当我单击Submit按钮时,将调用与上述下拉列表相关联的事件,并且从未调用javascript函数!这是预期的行为吗?如果是这样的话,我如何使javascript函数在触发事件之前被调用,从而允许检查用户是否从下拉列表中选择了值。

我不确定您是否已经阅读了前面的一个问题。你从未给出任何反馈,你接受了另一个答案。我已经警告过了,这种方法是一种黑客手段

你基本上是在滥用valueChangeListener。它的唯一目的是提供一个同时访问旧值和新值的点,以便您可以在必要时采取特定的业务操作,例如记录这两个值

使用它的唯一目的是仅基于新值自动填充另一个组件/元素,而您对旧值完全不感兴趣,这是一种攻击。如果您已经在使用JSF2.0,我真的强烈推荐链接答案中提到的方法

回到您的具体问题,您需要了解,只要提交的值与初始模型值不同,就会始终激发valueChangeListener。这与所有JavaScript帮助无关。onchange=submit并没有专门触发侦听器,它只是将整个表单提交给服务器。它恰好发生在终端用户更改下拉列表时,因此可以保证更改,因此监听器将在服务器端调用

您的问题表明您没有在valueChangeListener中使用提交的值设置模型值,并且您正在调用FacesContextrenderResponse。这种方法与我的链接答案的第1种方式几乎相同,除了将提交的值设置为模型值的行。因为您没有设置它,所以任何后续表单提交都会触发侦听器,因为提交的值与模型值不同!。此外,由于FacesContextresponseComplete跳过了调用操作阶段,因此永远不会调用操作方法


现在,再次阅读我的链接答案,看看如何正确地实现它

我不确定你是否读过你之前的一个问题。你从未给出任何反馈,你接受了另一个答案。我已经警告过了,这种方法是一种黑客手段

你基本上是在滥用valueChangeListener。它的唯一目的是提供一个同时访问旧值和新值的点,以便您可以在必要时采取特定的业务操作,例如记录这两个值

使用它的唯一目的是仅基于新值自动填充另一个组件/元素,而您对旧值完全不感兴趣,这是一种攻击。如果您已经在使用JSF2.0,我真的强烈推荐链接答案中提到的方法

回到您的具体问题,您需要了解,只要提交的值与初始模型值不同,就会始终激发valueChangeListener。这与所有JavaScript帮助无关。onchange=submit并没有专门触发侦听器,它只是将整个表单提交给服务器。它恰好发生在终端用户更改下拉列表时,因此可以保证更改,因此监听器将在服务器端调用

您的问题表明您没有在valueChangeListener中使用提交的值设置模型值,并且您正在调用FacesContextrenderResponse。这种方法与我的链接答案的第1种方式几乎相同,除了将提交的值设置为模型值的行。因为您没有设置它,所以任何后续表单提交都会触发侦听器,因为提交的值与模型值不同!。此外,由于FacesContextresponseComplete跳过了调用操作阶段,因此永远不会调用操作方法

现在,再次阅读我的链接答案,看看如何正确地实现它

<TD>
    <h:commandButton id="btnCheckVals" value="Submit"
    onclick="return checkSelectedVal(this);"
    ></h:commandButton>
 </TD>