使用ajax更新输入文本字段

时间:2014-09-29 18:56:54

标签: ajax jsf jsf-2 primefaces

我正在使用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“的组件......”

1 个答案:

答案 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(示例中没有)。