primefaces inputtext onblur事件不起作用

时间:2014-11-11 00:59:15

标签: jsf primefaces

你好我有一个关于blur事件的inputText,它会向支持bean发送一个信号,这个bean包含一个布尔变量,用于确定是否启用了另一个输入文本......但是我无法使这个工作,这个是我的代码:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
template="/Template.xhtml">
<ui:define name="content">
<h:form id="someForm">
<p:growl id="msg" showDetail="true" life="3000"/>
<p:panelGrid border="0" id="panel">
<p:row>
<p:column width="350">
Title
</p:column>
<p:column colspan="2">
<p:inputText id="someId" value="#{someBean.somePropertie}">
<p:ajax event="blur" update="anotherInput" listener="#{someBean.onEvent}" />
</p:inputText>
</p:column>
</p:row>
<p:row>
<p:column width="350">title 2</p:column>
<p:column colspan="2">
<p:inputText id="anotherInput" converter="toUpperCaseConverter" value="#{someBean.somePropertie2}" 
disabled="#{someBean.bDisabled}"
/>
</p:column>
</p:row>
</p:panelGrid>
</h:form>
</ui:define>
</ui:composition>

支持bean:

@ManagedBean
@SuppressWarnings("serial")
public class SomeBean implements Serializable{

private boolean bDisabled;

private String somePropertie;
private String somePropertie2;

public void onEvent(){

System.out.println("DO SOMETHING");

this.bDisabled = true;

}

... getters and setters of properties and boolean ....

}

这是主要的模板:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"  
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:head>
<title>..:: XXXXX ::..</title>
<meta http-equiv="Pragma" content="no-cache" />
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/css/default.css"/>
<style type="text/css">
.ui-growl{
position:absolute;
top:20%;
left:50%;
z-index:9999;
}

.ui-widget,.ui-widget .ui-widget {
font-family: Trebuchet MS;
}
</style>
</h:head>
<h:body style="background-color: #E1E1E1;">
<div id="page">
<div id="divHeader" style="height: 70px;">
<ui:insert name="header" >
<ui:include src="header.xhtml" />
</ui:insert>
</div>
<div id="divMenu" style="height: 50px;">
<ui:insert name="menu">
<ui:include src="menu.xhtml" />
</ui:insert>
</div>
<div id="divContent">
<ui:insert id="content" name="content" >
<ui:include src="content.xhtml" />
</ui:insert>
</div>
</div>   
</h:body>
</html>

转换器:

@FacesConverter("toUpperCaseConverter")
public class ToUpperCaseConverter implements Converter {
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return (String) value;
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return (value != null) ? value.toUpperCase() : null;
}

}

任何想法???

请帮助:(

1 个答案:

答案 0 :(得分:0)

您的问题并不完整,因为它没有提供重现错误的所有元素。您还没有提供调用元素的页面,也没有提供转换器等等。

JSF的调试器最好的朋友是firebug。始终检查javascript错误并启用网络选项卡以查看每个请求响应正文,其中可能包含&#34; silent&#34;错误消息。

我冒险尝试猜测你的问题: - )

这是你的代码,稍微更改为在我的主要界面4中运行。

<?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:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>You NEED a header</title>
</h:head>
<h:body>
    <h:form>
        <ui:include src="index2.xhtml" />   
    </h:form>
</h:body>
</html>

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
        <p:growl
            id="msg"
            showDetail="true"
            life="3000" />
        <p:panelGrid
            border="0"
            id="panel">
            <p:row>
                <p:column width="350">
Title
</p:column>
                <p:column colspan="2">
                    <p:inputText
                        id="someId"
                        value="#{someBean.somePropertie}">
                        <p:ajax
                            event="blur"
                            update="anotherInput"
                            listener="#{someBean.onEvent}" />
                    </p:inputText>
                </p:column>
            </p:row>
            <p:row>
                <p:column width="350">title 2</p:column>
                <p:column colspan="2">
                    <p:inputText
                        id="anotherInput"
                        value="#{someBean.somePropertie2}"
                        disabled="#{someBean.bDisabled}" />
                </p:column>
            </p:row>
        </p:panelGrid>
</ui:composition>

托管bean几乎相同

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean
@SuppressWarnings("serial")
public class SomeBean implements Serializable {

    private boolean bDisabled;

    private String somePropertie;
    private String somePropertie2;

    public void onEvent() {

        System.out.println("DO SOMETHING");

        this.bDisabled = true;

    }

    public boolean isbDisabled() {
        return this.bDisabled;
    }

    public void setbDisabled(boolean bDisabled) {
        this.bDisabled = bDisabled;
    }

    public String getSomePropertie() {
        return this.somePropertie;
    }

    public void setSomePropertie(String somePropertie) {
        this.somePropertie = somePropertie;
    }

    public String getSomePropertie2() {
        return this.somePropertie2;
    }

    public void setSomePropertie2(String somePropertie2) {
        this.somePropertie2 = somePropertie2;
    }

}

我注意到如果你不从调用者页面省略HEAD部分,它似乎呈现并工作。

但是,如果您忘记了 HEAD 部分(您不能,请参阅Primefaces FAQ第2项),那么您将完全呈现该页面,但您将会这样做得到一些javascript错误,你的页面无法正常工作。我正在讨论的HEAD部分就是这个

<h:head>
    <title>You NEED a header</title>
</h:head>

这是没有HEAD部分的样子。

enter image description here

使用HEAD部分,它似乎有效。还要注意细微的主要外观和感觉。

enter image description here