本文介绍了ui:repeat 中 h:inputText 的值不被处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想处理这个表单(valueChangueListener 在实际情况下无效).

I want to process this form (valueChangueListener is not valid in real case).

这是后豆:

public class TestBean extends PrivateBaseBean implements Serializable {
private List<String> strings;

@PostConstruct
public void init() {
    strings = new ArrayList<String>();
    strings.add("");
    strings.add("");
    strings.add("");
}

public void saveAction(ActionEvent event) {

    StringBuilder textToShowInMessage = new StringBuilder();
    for (String string : strings) {
        textToShowInMessage.append(string);
        textToShowInMessage.append("; ");
    }
    FacesMessage msg = new FacesMessage(super.getBundle().getString(
            textToShowInMessage.toString()), "");

    FacesContext.getCurrentInstance().addMessage(null, msg);
}

getters... setters...

视图:

....
<h:form>
<ui:repeat var="string" value="#{testBean.strings}">
    <h:inputText value="#{string}" />
    <br />
</ui:repeat>
<p:commandButton value="#{msg.save}"
actionListener="#{testBean.saveAction}" icon="ui-icon-disk"
        update="@form" />
</h:form>
...

当表单在后台处理时,bean 字符串列表始终为空.

When the form is processed in the back bean string list always is blank.

如何在没有任何值更改侦听器的情况下处理表单输入的内部迭代?

How to process form intput's inside iteration, without any value changue listener?

有一些截图:

action 或 actionListener on 出现同样问题

The same problem occurs with action or actionListener on

推荐答案

您的问题与 PrimeFaces 的行为无关,而是与隐含的范围界定问题有关使用 标签时创建.

Your problem is not connected with PrimeFaces <p:commandButton>'s behaviour, but rather with a scoping problem that is implicilty created when using the <ui:repeat> tag.

首先,让我们脱离你的例子.基本上,你有

First of all, let's depart from your example. Basically, you've got

<ui:repeat value="#{bean.strings}" var="s">
    <h:inputText value="#{s}"/>
</ui:repeat>

有支持 List字符串.

罪魁祸首在这里:value="#{s}". 导出的变量 s 仅在其循环内可见,并且它不绑定到任何托管 bean 的属性,但是而只是一个局部变量.换句话说,s 并不像人们所期望的那样绑定/等于 bean.strings[index] 并且不知道,正如我们所看到的,它起源于哪里.因此,基本上,您已经摆脱了单边关系:来自 bean 的值正确地打印在您的输入中,但反过来却没有发生.

The culprit is here: value="#{s}". The exported by <ui:repeat> variable s is visible only within its loop and it is not bound to any managed bean's property, but instead only to a local variable. Put it differently, s is not bound/equal to bean.strings[index] as one would expect and has no knowledge, as we see, where it originated from. So basically, you're off with a unilateral relationship: value from the bean is printed in your input properly, but the reverse is not happening.

解决方法 #1:包装类/模型对象

可以通过为您的类使用包装器对象来克服这种情况.如果是字符串,它可能是一个简单的可变字符串",如下所示:

The situation can be overcome by using a wrapper object for your class. In case of a string it could be a 'simple mutable string', like below:

public class MString {
    private String string;//getter+setter+constructor
}

在这种情况下,迭代将按预期工作:

In this case the iteration will be working as predicted:

<ui:repeat value="#{bean.mstrings}" var="ms">
    <h:inputText value="#{ms.string}"/>
</ui:repeat>

有支持 Listmstrings.

请注意,如果您有模型类,例如 User,并且将在 中更改其属性,则该类本身将是有效的包装器,以便适当地设置属性.

Note that if you have your model class, like User, and will change its properties within <ui:repeat> the class itself will be effectively a wrapper, so that the properties will be set appropriately.

解决方法 2:链式属性访问

另一种解决方法是直接从 <h:inputText> 标签内访问集合的元素.这样,任何此类属性都将通过访问 bean、集合、然后在所需索引处设置属性来设置.太长了,但就是这样.至于如何问题, 提供了一个导出的当前迭代状态变量,varStatus,它将用于访问托管中的数组/集合豆.

Another workaround consists of accessing an element of your collection directly from within a <h:inputText> tag. This way, any such property will be set by accessing the bean, then collection, then setting the property at the desired index. Excessively long, but that's how it is. As to the how question, <ui:repeat> provides for an exported current iteration status variable, varStatus, that will be used to access the array/collection in the managed bean.

在这种情况下,迭代也将按预期工作:

In this case the iteration will also be working as predicted:

<ui:repeat value="#{bean.strings}" var="s" varStatus="status">
    <h:inputText value="#{bean.strings[status.index]}"/>
</ui:repeat>

普通支持List字符串.

这篇关于ui:repeat 中 h:inputText 的值不被处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 02:46
查看更多