【发布时间】:2016-09-03 06:20:08
【问题描述】:
我在使用带有 ajax 的 bootsfaces inputText 时发现了一个问题。 我正在使用 JSF 2.2、Bootsfaces 0.8.1 和 Primefaces 5.3。
我正在尝试在 inputText 字段中输入日期值。一旦我输入日期的最后一个值, inputText 就会触发更改事件。此时我想使用 ajax 来调用 bean 方法。问题是,一旦我尝试输入最后一个值并且从未调用过该方法,我的字段就会失去焦点。
所以我尝试了一些 Primefaces,它几乎可以按我想要的方式工作。此时我有不同的问题:
- 为什么我的 inputText 字段在输入最后一个值时失去焦点? (靴面)
- 为什么在我失去焦点后从未调用过bean方法? (靴面)
- 是否可以在字段设置 bean 值后调用 bean 方法? (Primefaces)
我在下面添加了代码,所以也许你可以重现这种行为。
test.xhtml - 包含 primefaces 和 bootsfaces 字段的示例 xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:b="http://bootsfaces.net/ui"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<meta charset="UTF-8"/>
</h:head>
<h:body>
<h:form id="form">
<b:panel id="filterPanel" title="Filter properties" immediate="true" collapsed="false" collapsible="true">
<b:row>
<b:column span="12">
<b:inputText id="dateA" type="date" value="#{test.dateA}" immediate="true" class="form-control">
<f:ajax event="change" listener="#{test.searchA()}"/>
</b:inputText>
</b:column>
</b:row>
<b:row>
<b:column span="12">
<p:inputText id="dateB" type="date" value="#{test.dateB}" immediate="true" class="form-control">
<p:ajax event="change" listener="#{test.searchB()}"/>
</p:inputText>
</b:column>
</b:row>
</b:panel>
</h:form>
</h:body>
</html>
TestBean.java - 用于设置值和调用方法的 bean
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = "test")
@ViewScoped
public class TestBean {
private String dateA;
private String dateB;
public void searchA() {
System.out.println("Search A");
}
public void searchB() {
System.out.println("Search B");
}
public String getDateA() {
return dateA;
}
public void setDateA(String dateA) {
this.dateA = dateA;
System.out.println(dateA);
}
public String getDateB() {
return dateB;
}
public void setDateB(String dateB) {
this.dateB = dateB;
System.out.println(dateB);
}
}
请帮助我找到解决方案或解释我在这里做错了什么。
谢谢 微博
【问题讨论】:
-
你可以试试我们两天前发布的 BootsFaces 0.8.5。似乎我们在那里解决了一些关于这个问题的错误。 (正确调用了监听器)但是,我目前不确定,为什么有时会先调用backing bean方法并且还没有时间研究。很遗憾我现在无法提供完整的答案,但可以推荐尝试新版本:)
-
我也完全无法重现失去焦点的情况。你用的是哪个浏览器?
-
我使用的是 Chrome 50.0.2661.94。我已经尝试过使用 Bootsfaces 0.8.5。它工作正常。问题是我不能使用 0.8.5,因为这个版本有不同的问题/错误。我可能会在 0.8.5 中就该问题提出一个新问题,但目前我根本没有时间。我想我会尝试一种没有 ajax 的解决方法,用按钮或类似的东西调用该方法。或者我再次尝试 Primefaces,并在调用侦听器时更改相位。
-
请随时通过bug tracker 向我们报告该错误。我们计划很快发布另一个错误修复版本,因此我们可能会在途中修复它。
-
我不明白你的第三个问题。当我尝试演示时,只要输入是有效数据,就会在每次击键时调用
searchB()。
标签: jsf primefaces focus bootsfaces ajax-update