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

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

所以我尝试了一些 Primefaces,它几乎可以像我想要的那样工作。在这一点上,我得到了不同的问题:

  • 为什么我的 inputText 字段在输入最后一个值时失去焦点? ( Bootsfaces )
  • 为什么我失去焦点后永远不会调用bean方法? ( Bootsfaces )
  • 是否可以在字段设置bean值后调用bean方法? ( 素面 )

  • 我添加了下面的代码,所以也许你可以重现这种行为。

    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 和 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"用于 <b:commandButton /><b:commandLink />
  • process="@this"对于每个其他 BootsFaces 组件
  • 每个 BootsFaces 组件的
  • update="@form"

  • 根据 Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes ,PrimeFaces 默认值为:
    jsf - Bootsfaces inputText 因在 bean 中使用 ajax 和更新值而失去焦点-LMLPHP

    为方便起见,这是我的 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 对其进行了测试。

    关于jsf - Bootsfaces inputText 因在 bean 中使用 ajax 和更新值而失去焦点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37101804/

    10-11 17:20