3

Bootsfaces の inputText を ajax で使用しているときに問題が見つかりました。私は JSF 2.2、Bootsfaces 0.8.1、および Primefaces 5.3 を使用しています。

inputText フィールドに日付値を入力しようとしています。日付の最後の値を入力するとすぐに、inputText が変更イベントをトリガーする必要があります。この時点で、Bean メソッドの呼び出しに ajax を使用したいと思います。問題は、最後の値を入力しようとするとすぐにフィールドがフォーカスを失い、メソッドが呼び出されないことです。

そこで、Primefaces で少し試してみたところ、ほぼ思いどおりに動作しました。この時点で、さまざまな質問を受けました。

  1. 最後の値を入力しているときに、inputText フィールドがフォーカスを失うのはなぜですか? (ブーツフェイス)
  2. フォーカスを失った後、bean メソッドが呼び出されないのはなぜですか? (ブーツフェイス)
  3. 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);
    }

}

解決策を見つけるのを手伝ってくれるか、ここで何が間違っているのか説明してください。

ありがとう

4

1 に答える 1

2

BootsFaces と PrimeFaces の微妙な違いを発見しました。わかりやすくするために、processとの値を常に定義することをお勧めします。updateあなたの場合、

    <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 とまったく同じように動作します。

updateとのデフォルト値processは異なります。BootsFaces 0.8.5 以降、デフォルト値は次のとおりです。

  • process="@form" for <b:commandButton />and<b:commandLink />
  • 他のすべての BootsFaces コンポーネントの process="@this"
  • すべての 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 でテストしました。

于 2016-05-09T18:24:34.430 に答える