0

我正在设计一个表单制作器,用户可以在其中为他们的问题添加多个选项。因此,每个选项都有一个添加新选项按钮和一个删除按钮。我想dataTable在我的 Facelets 页面中使用 a 并将其与HtmlDataTable我的托管 bean 中的 an 绑定,以便动态添加/删除选项,因为我们不知道他们想要添加多少选项。所以我所做的是 my 的值dataTable是一个List字符串。我的输入文本(选项)被添加和删除,当他们添加整个问题时,它们被正确存储在我的数据库中。但是每次按下添加或删除按钮时,我的选项都是空的,因此用户必须再次输入它们。我的代码有点长,所以我会为您提供它们的简化版本。

在我的 Facelets 页面上,我有:

<h:dataTable value="#{questionMaker.selectOneOptionList}" var="option" binding="#{questionMaker.table}"> 
<h:column>                                                                                     
<h:inputText value="#{option}"/>
<h:commandLink value="remove option" action="#{questionMaker.removeRadioButtonOption}"/>                                           
</h:commandLink>
</h:column>
</h:dataTable>

在我的托管 bean 中,上述变量是:

private HtmlDataTable table;
private List<String> selectOneOptionList;

当然,他们也有 getter 和 setter。这是我的添加方法:

public void addRadioButtonOption() {
    String option = new String();
    selectOneOptionList.add(option);

}
4

1 回答 1

2

这种方法有几个(潜在的)问题:

  • 为了使这个构造工作,bean 必须是视图范围的(不是请求范围或会话范围)。在请求范围内,selectOneOptionList将在每个请求上重新创建。你不想拥有那个。在会话范围内,bean 将在所有浏览器窗口/选项卡之间共享。你也不想拥有那个。

  • binding属性在视图构建期间运行。因此,如果#{questionMaker}是视图范围,那么由于JSF 问题 790 ,它会成为隐式请求范围。

  • 作为一个不可变对象,String 没有setter 方法。将<h:inputText value="#{option}"/>永远无法设置输入的值。

因此,要解决您的问题,您必须:

  • 确保您的 bean 是@ViewScoped.
  • 不要让binding属性指向视图范围的 bean 属性。
  • 要么用String一个完整的 javabean 替换,要么按索引访问列表项。

所以,这应该可以(假设你List<String>出于某种原因仍然想坚持):

<h:dataTable value="#{questionMaker.selectOneOptionList}" binding="#{table}"> 
  <h:column>                                                                                     
    <h:inputText value="#{questionMaker.selectOneOptionList[table.rowIndex]}"/>
    ...
  </h:column>
</h:dataTable>
<h:commandButton value="add" action="#{questionMaker.addRadioButtonOption}" />

@ManagedBean
@ViewScoped
public class QuestionMaker {

    private List<String> selectOneOptionList;

    @PostConstruct
    public void init() {
        selectOneOptionList = new ArrayList<String>();
    }

    public void addRadioButtonOption() {
        selectOneOptionList.add(new String());
    }

    public List<String> getSelectOneOptionList() {
        return selectOneOptionList;
    }

}

也可以看看:

于 2012-10-02T13:24:17.830 回答