我正在使用primefaces 5.0。我正在尝试为每个“用户 - 产品”实现一组输入字段,其中每个面板的InputText字段中的值总和只能是100%。因此,例如,如果我有3个字段,每个字段必须是33.333%,如果我降低这三个字段的一个值,我必须重新分配其他两个值,即(25%,37.5%,37.5%)。像Humblebundle这样的东西有助于他们的慈善机构再分配。
当我使用ui生成动态字段时:重复我无法获取ajax来更新面板中的其他字段。 XHTML文件:
<p:tab id="tuning" title="Employee tuning">
<p:panel header="Set employee plans">
<p:messages />
<h:panelGrid columns="2" columnClasses="label, value">
<ui:repeat value="#{planSetViewController.office_plan_groups}" var="office_plan_group">
<p:panel id="#{office_plan_group.product_group.name}_group" header="#{office_plan_group.product_group.name}" style="float:left;">
<ui:repeat value="#{office_plan_group.product_plans}" var="product_plan" varStatus="var">
<p:panel header="#{product_plan.product.name}" style="float:left; width: 225px;">
<h:panelGrid columns="3" cellspacing="10" cellpadding="3">
<ui:repeat value="#{product_plan.employee_plans}" var="employee_plan">
<p:outputLabel value="#{employee_plan.employee.name}"/>:
<p:outputLabel value="#{employee_plan.plan.value}" style="margin:3px;"/>
<p:inputText value="#{employee_plan.percentage}" style="width:30px;margin: 3px;">
<p:ajax listener="#{product_plan.setPercentage(employee_plan)}" update="@all" />
</p:inputText>
</ui:repeat>
</h:panelGrid>
</p:panel>
</ui:repeat>
</p:panel>
</ui:repeat>
</h:panelGrid>
</p:panel>
</p:tab>
和bean文件:
public class Product_plan {
private Product product;
private List<Employee_plan> employee_plans;
private float product_plan_value;
public void setPercentage(Employee_plan employee_plan)
{
float newPercentage;
if(employee_plans.size() > 1)
{
newPercentage = (100 - employee_plan.getPercentage())/(employee_plans.size()-1);
}
else
newPercentage = (100 - employee_plan.getPercentage());
System.out.println("setPercentage: "+newPercentage);
for(int i=0;i<employee_plans.size();i++)
{
if(employee_plans.get(i).getPlan().getPlan_realization_ID() != employee_plan.getPlan().getPlan_realization_ID())
{
System.out.println("Setting...");
employee_plans.get(i).setPercentage(newPercentage);
employee_plans.get(i).getPlan().setValue((newPercentage/100)*product_plan_value);
}
}
}
编辑:
我已经尝试使用update =“@ form”并使用静态<div id="something">
包装面板并更新它,然后我得到了这个奇怪的错误:
“javax.faces.FacesException:找不到带有表达式”some“的组件......”
答案 0 :(得分:1)
尝试为您的h:panelGrid
提供一个ID,并在update
- 代码中引用它:
<h:panelGrid id="percentagePanel" columns="3" .... >
<ui:repeat value="#{product_plan.employee_plans}" var="employee_plan">
...
<p:inputText value="#{employee_plan.percentage}" style="width:30px;margin: 3px;">
<p:ajax update="percentagePanel" listener="#{product_plan.setPercentage(employee_plan)}" />
</p:inputText>
</ui:repeat>
</h:panelGrid>
与普通div相比,h:panelGrid
是一个JSF组件,因此由引擎找到。
除此之外,您可以尝试update="@parent"
以相对的方式引用inputfield的下一个父组件(在本例中为panelGrid)。
请确保您周围有h:form
(示例中没有)。