Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何在bean'中的UIData组件内收集UIInput组件的值;什么是行动方法?_Jsf 2_Datatable_Richfaces - Fatal编程技术网

Jsf 2 如何在bean'中的UIData组件内收集UIInput组件的值;什么是行动方法?

Jsf 2 如何在bean'中的UIData组件内收集UIInput组件的值;什么是行动方法?,jsf-2,datatable,richfaces,Jsf 2,Datatable,Richfaces,在bean的操作方法期间,我试图在UIData组件中收集UIInput组件的值,以便验证重复的值。我试图将UIInput组件绑定到bean属性并获取其值,但它打印null。如果我把它放在datatable之外,那么它会打印期望值。数据表有什么问题吗 <rich:dataTable binding="#{bean.table}" value="#{bean.data}" var="item"> <h:column> <f:facet name=

在bean的操作方法期间,我试图在
UIData
组件中收集
UIInput
组件的值,以便验证重复的值。我试图将
UIInput
组件绑定到bean属性并获取其值,但它打印
null
。如果我把它放在datatable之外,那么它会打印期望值。数据表有什么问题吗

<rich:dataTable binding="#{bean.table}" value="#{bean.data}" var="item">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Field1" />
        </f:facet>
        <h:inputText binding="#{bean.input}" value="#{item.field1}" />
    </h:column>
</rich:dataTable>

数据表没有问题。JSF组件树中只有一个
UIInput
组件,每当父组件对模型的每个项进行迭代时,其状态都会发生更改。因此,状态仅在
UIData
迭代期间可用,而不是在迭代之前或之后可用。当父
UIData
组件没有在bean的action方法中迭代时,您试图访问单个组件的值,因此这些值将始终返回
null

您需要通过访问
UIData
上的组件树,并在
VisitCallback
实现中收集感兴趣的信息

table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() {
    @Override
    public VisitResult visit(VisitContext context, UIComponent target) {
        if (target instanceof UIInput) {
            UIInput input = (UIInput) target;
            System.out.println("id: " + input.getId());
            System.out.println("value: " + input.getValue());
        }

        return VisitResult.ACCEPT;
    }
});

顺便说一下,您通常会使用
UIInput
组件上的正常
Validator
执行验证,或者在这种特殊情况下,最好使用
ValueChangeListener
。这使得失效和消息处理更加容易。

数据表没有问题。JSF组件树中只有一个
UIInput
组件,每当父组件对模型的每个项进行迭代时,其状态都会发生更改。因此,状态仅在
UIData
迭代期间可用,而不是在迭代之前或之后可用。当父
UIData
组件没有在bean的action方法中迭代时,您试图访问单个组件的值,因此这些值将始终返回
null

您需要通过访问
UIData
上的组件树,并在
VisitCallback
实现中收集感兴趣的信息

table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() {
    @Override
    public VisitResult visit(VisitContext context, UIComponent target) {
        if (target instanceof UIInput) {
            UIInput input = (UIInput) target;
            System.out.println("id: " + input.getId());
            System.out.println("value: " + input.getValue());
        }

        return VisitResult.ACCEPT;
    }
});
顺便说一下,您通常会使用
UIInput
组件上的正常
Validator
执行验证,或者在这种特殊情况下,最好使用
ValueChangeListener
。这使得失效和消息处理更加容易