JSF Ajax 仅调用了第 1 次
JSF Ajax called only 1st time
在 JSF2 中,我有一个像这样的 XHTML:
<h:form id="myForm">
...
<c:forEach items="#{myController.header}" var="hd" varStatus="count">
#{hd}
<h:selectOneMenu value="#{myController.type[count.index]}" id="formtype" >
<f:selectItem itemValue="Nop" itemLabel="Nop" />
<f:selectItem itemValue="Yep" itemLabel="Yep" />
<f:ajax render="@form" />
</h:selectOneMenu>
#{myController.type[count.index]}
<h:selectBooleanCheckbox value="#myController.valid[count.index]}" id="valid">
<f:ajax render="@form"/>
</h:selectBooleanCheckbox>
#{myController.valid[count.index]}
</c:forEach>
...
</h:form>
我的托管 bean 有:
private String[] type;
private boolean[] valid;
我在第一次加载命名 bean 时初始化(type = new String[...];
并为每个位置分配一个值)。
如果我修改组合或复选框,它起作用,托管 bean 中的值会更改,新值会在 JSF 页面中打印(呈现)。但是只是第一次。接下来的更改根本不会修改任何内容。这很奇怪,因为我在其他应用程序中有类似的代码并且工作正常,所以我做错了但找不到它。我的模板有一个 h:header
并且我在 JS 控制台或 TomEE 中看不到任何日志(我只看到 .INFO - The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myApp]] after start() had already been called. The second call will be ignored
但我认为它是不相关的)。我尝试添加 execute="@this"
/execute="@form"
和其他人,但没有成功,并检查了 this post 的所有要点,但似乎没有任何内容适用于我。
我没有看到什么错误?
编辑
@Named(value = "myController")
@ViewScoped
public class MyController implements Serializable {
...
我的模板中也有一个 <h:messages globalOnly="true" showDetail="true" showSummary="true" />
。
我想我终于明白了!
感谢两件事:
BalusC answer 中的第 3 点。我在模板 <h:messages id="msg"
中为我的消息添加了一个 id,然后使用 <f:ajax render="@form msg"....
。这导致出现错误 j_idt1: Validation Error: Value is required
。
然后我可以在this post中找到解决方案:将所需参数从true
更改为<f:viewParam required="#{!facesContext.postback}"
。这在我的其他应用程序中不是必需的,因为必需的是 "false",因为它可以使用参数或不使用它来调用。当使用参数调用它时,它起作用了,因为偶然发现页面可以在没有它的情况下调用。
运行 遇到完全相同的问题,我的 <f:ajax>
标记第一次可以工作,然后什么都没有...页面上没有错误或任何内容。几个小时后,经过无数次谷歌搜索,什么也没有出现。 (Whosebug 上的大多数问题实际上都有相反的问题,Ajax 第一次不会触发,但之后它会正常工作)。我终于偶然发现了这个问题,它准确地描述了我所看到的。
我之前只尝试重新呈现页面的一部分,但我注意到一旦我将 render
属性更改为 "@all"
,我就会收到与上述相同的错误消息:
j_idt1: Validation Error: Value is required
我向上滚动并注意到我有一个 <f:viewParam>
,要求设置为 "true"
。我进行了 user1156544 描述的更改并且成功了。
在 JSF2 中,我有一个像这样的 XHTML:
<h:form id="myForm">
...
<c:forEach items="#{myController.header}" var="hd" varStatus="count">
#{hd}
<h:selectOneMenu value="#{myController.type[count.index]}" id="formtype" >
<f:selectItem itemValue="Nop" itemLabel="Nop" />
<f:selectItem itemValue="Yep" itemLabel="Yep" />
<f:ajax render="@form" />
</h:selectOneMenu>
#{myController.type[count.index]}
<h:selectBooleanCheckbox value="#myController.valid[count.index]}" id="valid">
<f:ajax render="@form"/>
</h:selectBooleanCheckbox>
#{myController.valid[count.index]}
</c:forEach>
...
</h:form>
我的托管 bean 有:
private String[] type;
private boolean[] valid;
我在第一次加载命名 bean 时初始化(type = new String[...];
并为每个位置分配一个值)。
如果我修改组合或复选框,它起作用,托管 bean 中的值会更改,新值会在 JSF 页面中打印(呈现)。但是只是第一次。接下来的更改根本不会修改任何内容。这很奇怪,因为我在其他应用程序中有类似的代码并且工作正常,所以我做错了但找不到它。我的模板有一个 h:header
并且我在 JS 控制台或 TomEE 中看不到任何日志(我只看到 .INFO - The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myApp]] after start() had already been called. The second call will be ignored
但我认为它是不相关的)。我尝试添加 execute="@this"
/execute="@form"
和其他人,但没有成功,并检查了 this post 的所有要点,但似乎没有任何内容适用于我。
我没有看到什么错误?
编辑
@Named(value = "myController")
@ViewScoped
public class MyController implements Serializable {
...
我的模板中也有一个 <h:messages globalOnly="true" showDetail="true" showSummary="true" />
。
我想我终于明白了!
感谢两件事:
BalusC answer 中的第 3 点。我在模板
<h:messages id="msg"
中为我的消息添加了一个 id,然后使用<f:ajax render="@form msg"....
。这导致出现错误j_idt1: Validation Error: Value is required
。然后我可以在this post中找到解决方案:将所需参数从
true
更改为<f:viewParam required="#{!facesContext.postback}"
。这在我的其他应用程序中不是必需的,因为必需的是 "false",因为它可以使用参数或不使用它来调用。当使用参数调用它时,它起作用了,因为偶然发现页面可以在没有它的情况下调用。
运行 遇到完全相同的问题,我的 <f:ajax>
标记第一次可以工作,然后什么都没有...页面上没有错误或任何内容。几个小时后,经过无数次谷歌搜索,什么也没有出现。 (Whosebug 上的大多数问题实际上都有相反的问题,Ajax 第一次不会触发,但之后它会正常工作)。我终于偶然发现了这个问题,它准确地描述了我所看到的。
我之前只尝试重新呈现页面的一部分,但我注意到一旦我将 render
属性更改为 "@all"
,我就会收到与上述相同的错误消息:
j_idt1: Validation Error: Value is required
我向上滚动并注意到我有一个 <f:viewParam>
,要求设置为 "true"
。我进行了 user1156544 描述的更改并且成功了。