【问题标题】:Bootsfaces inputText loses focus caused by using ajax and updating value in beanBootsfaces inputText由于使用ajax和更新bean中的值而失去焦点
【发布时间】:2016-09-03 06:20:08
【问题描述】:

我在使用带有 ajax 的 bootsfaces inputText 时发现了一个问题。 我正在使用 JSF 2.2、Bootsfaces 0.8.1 和 Primefaces 5.3。

我正在尝试在 inputText 字段中输入日期值。一旦我输入日期的最后一个值, inputText 就会触发更改事件。此时我想使用 ajax 来调用 bean 方法。问题是,一旦我尝试输入最后一个值并且从未调用过该方法,我的字段就会失去焦点。

所以我尝试了一些 Primefaces,它几乎可以按我想要的方式工作。此时我有不同的问题:

  1. 为什么我的 inputText 字段在输入最后一个值时失去焦点? (靴面
  2. 为什么在我失去焦点后从未调用过bean方法? (靴面
  3. 是否可以在字段设置 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


【解决方案1】:

您发现 BootsFaces 和 PrimeFaces 之间存在细微差别。为了清楚起见,我建议您始终定义 processupdate 的值。在你的情况下,

    <b:inputText id="dateA" type="date" value="#{test.dateA}" immediate="true" class="form-control">
        <f:ajax event="change" listener="#{test.searchA()}" render="@none"/>
    </b:inputText>

使 BootsFaces 输入字段的行为与其 PrimeFaces 对应项完全相同。

updateprocess 的默认值不同。自 BootsFaces 0.8.5 起,默认值为:

  • process="@form" 用于&lt;b:commandButton /&gt;&lt;b:commandLink /&gt;
  • process="@this" 适用于所有其他 BootsFaces 组件
  • 每个 BootsFaces 组件的update="@form"

根据Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes,PrimeFaces 默认值为:

为方便起见,这是我的 XHTML 文件版本:
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 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()}" render="@none"/>                        
                            </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>                                                                                                                 

我已经用 BootsFaces 0.8.5 对其进行了测试。

【讨论】:

  • 对不起,我的回答迟了。我昨天很忙。我试过你的例子,但它对我不起作用。它仍然是同样的问题。也许我在其他地方遇到了问题,阻止我使用这种方法。有没有可能有什么东西阻止了这一点?
  • 我已经添加了完整的 XHTML 文件——也许还有另一个细微的差别。您在键入时是否看到任何 AJAX 请求?一旦数据有效,第一个 AJAX 请求就会发生 - 在我的示例中,它是在键入“12.12.1”之后(使用欧洲语言环境,因此是点)。
  • 现在我知道问题所在了。您使用 0.8.5 版进行了测试,但我使用了 0.8.1 版。我说我不能使用 0.8.5 但也许我试一试。我可以给你发私信问一些关于 bootsfaces 的问题吗?我会接受您的回答,因为它是解决此问题的方法,但对于 0.8.1 版,它不适用于相同的代码。
  • 您可以在 Beyondjava.de 上将您的消息发送给 webmaster1。
  • 你是对的 - BootsFaces 0.8.1 存在一两个 AJAX 问题,我们已在 0.8.5 中修复。我不知道您的特定问题也受到影响,因为我没有尝试使用旧版本。接下来我会更加了解并仔细按照您的指示进行操作:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多