bootsfaces inputTest使用f:ajax来自f:viewAction的意外调用bean方法

时间:2016-04-15 22:16:53

标签: jsf bootsfaces

我有两个托管bean NavigationStateClientManager都是viewScope。

NavigationState具有viewAction上引用的getContentPage()方法:

<c:metadata>
    <c:viewAction action="#{navState.init('client', 'clientDetails')}"/>
</c:metadata>

ClientManager具有在靴面searchingClients上引用的inputText方法

 <b:inputText placeholder="nome" id="name"
                value="#{clientManager.clientOnSearch.firstName}"
                style="background: rgb(251, 251, 251) none repeat scroll 0% 0%;
                    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);">
            <c:ajax execute="name" event="keyup" 
            listener="#{clientManager.searchingClients()}" />       
            </b:inputText>

当我在此输入文本字段上键入密钥时,唯一的方法是来自getContentPage()的{​​{1}}而不是来自NavigationState的{​​{1}}

知道为什么会这样吗?

谢谢

布鲁诺

1 个答案:

答案 0 :(得分:0)

viewAction

的用法

首先,检查您是否确实需要使用viewAction,您也可以在支持bean中使用简单的@PostConstruct。 (如果您想了解有关差异的更多信息,请参阅this answer。)

目前看来,每次GET请求都会触发viewAction。但是我对viewAction内部不熟悉,也许你的支持bean是请求作用域,因此在每个ajax请求上初始化?

如果你摆脱它可能会有所帮助。如果您不需要viewParam,请改用@PostConstruct

使用BootsFaces的Ajax

您的clientManager.searchingClients()方法签名是什么样的? 如果它看起来像clientManager.searchingClients(AjaxBehaviorEvent e),使用parantheses工作,您必须选择clientManager.searchingClients

否则我不会在您的JSF标记中看到任何错误,它与showcase's first example完全相同。

但是,我从未真正使用过f:ajax(或c:ajax)。它总是有点古怪。但你也不必:如果PrimeFaces有p:ajaxBootsFaces we got our own recommended way of invoking ajax listeners

所以也许你想尝试一下:

 <b:inputText placeholder="nome" id="name"
     value="#{clientManager.clientOnSearch.firstName}"
     style="background: rgb(251, 251, 251) none repeat scroll 0% 0%;
            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);"
     onkeyup="ajax:clientManager.searchingClients()"/>

在尝试当前的0.8.1 Showcase时,我发现,InputText ajax示例并没有起作用,所以我会调查,如果这是由0.8.1或旧版本的展示引起的。它适用于Snapshot Showcase