当我打电话给
时,我无法理解为什么在我的PrimeFaces视图中<f:setPropertyActionListener value="#{item}" target="#{tagController.current}" />
它从不调用支持的bean tagController.setCurrent方法。
我有以下观点:
<h:form id="tableForm" styleClass="form-horizontal">
<h:panelGroup id="dataPanel">
<p:dataTable value="#{tagController.lazyModel}"
lazy="true"
id="table"
var="item"
paginator="true"
rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="10,20,50" >
<p:column headerText="Name" sortBy="#{item.name}" filterBy="#{item.name}">
<h:outputText value="#{item.name}"/>
</p:column>
<p:column>
<p:commandLink id="testButton" update=":testForm:panel" process="@this">
<h:outputText value="Test" />
<f:setPropertyActionListener value="#{item}" target="#{tagController.current}" />
</p:commandLink >
</p:column>
</p:dataTable>
</h:panelGroup>
</h:form>
<br/>
<h:form id="testForm" styleClass="form-horizontal">
<p:panelGrid columns="4" id="panel" >
<h:outputLabel value="Name: #{tagController.current.name}" />
</p:panelGrid>
</h:form>
以及以下支持的bean:
@ViewScoped
@Named
public class TagController implements Serializable {
@Inject
TagFacade tagFacade;
protected LazyDataModel<Tag> lazyModel;
protected ResourceBundle bundle = ResourceBundle.getBundle("resources/messages");
@Getter
protected Tag current = new Tag();
public void setCurrent(Tag current) {
System.out.println(">>>>>>>>>> THIS METHOD IS NEVER CALLED ? WHY ?");
this.current = current;
}
public LazyDataModel<Tag> getLazyModel() {
//... omitted for brevity
}
}
数据表运行良好,我看到数据,分页器,过滤器和排序工作正常但是当我点击测试链接时没有任何反应(没有异常,没有javascript错误进入html页面,没有消息打印到stdout ... )。
我正在使用Glassfish 3.1.2 / Mojarra 2.1.22 / PrimeFaces 3.5。
有人可以帮助我吗?
非常感谢...
答案 0 :(得分:1)
我注意到您正在将CDI与JSF注释混合使用。 CDI没有视图范围注释。您应该用CDI范围替换视图范围或将@named注释更改为@Managedbean
答案 1 :(得分:0)
<p:column>
<p:commandButton id="bb" actionListener="#{yourmanagedbean.setmyvalue(item)}"
title="Test" update=":testForm:panel">
</p:commandButton>
</p:column>
在支持bean中看起来像这样
public void setCurrent(Tag current) throws Exception {
try {
this.current = current;
} catch (Exception e) {
// ...
}
}
尝试在面板中制作panelgrid并进行更新。
答案 2 :(得分:0)
由于你正在使用getter的注释,我怀疑默认情况下setter会直接传递你的变量。
你应该尝试这样
private Tag current = new Tag();
public void setCurrent(Tag current) {
System.out.println(">>>>>>>>>> THIS METHOD IS NEVER CALLED ? WHY ?");
this.current = current;
}
public Tag getCurrent() {
return this.current;
}
更多信息:
答案 3 :(得分:0)
我有同样的问题,但有不同的解决方案。我有正确的注释等等,但有一个对话框(我甚至没有使用)有以下代码
<h:inputText value="#{aSBean.newElement.vaSl}" validatorMessage="Nr bitte numerisch eingeben">
<f:validateDoubleRange minimum="1" maximum="999" />
</h:inputText>
不知何故(仍然不知道为什么)我的setter不能在对话框中使用这段代码。只是添加这个以防其他人有这个问题,因为我花了几天才发现。