我在JSF 2.0中使用一个简单的应用程序有一些问题.
我尝试使用ajax支持构建ToDo列表.我有一些todo字符串,我使用数据表显示.在这个数据表中,我有一个commandLink来删除任务.现在的问题是数据表不会被重新渲染.
<h:dataTable id="todoList" value="#{todoController.todos}" var="todo">
<h:column>
<h:commandLink value="X" action="#{todoController.removeTodo(todo)}">
<f:ajax execute="@this" render="todoList" />
</h:commandLink>
</h:column>
<h:column>
<h:outputText value="#{todo}"/>
</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
编辑(TodoController):
@ManagedBean
@SessionScoped
public class TodoController {
private String todoStr;
private ArrayList<String> todos;
public TodoController() {
todoStr="";
todos = new ArrayList<String>();
}
public void addTodo() {
todos.add(todoStr);
}
public void removeTodo(String deleteTodo) {
todos.remove(deleteTodo);
}
/* getter / setter */
}
Run Code Online (Sandbox Code Playgroud) 我的页面由几个区域组成,这些区域是通过迭代使用的项目列表创建的<ui:repeat>.想象一下这个简化的例子:
<h:form id="form">
<ui:repeat id="repeatContainer" var="item" value="#{testBean.items}" varStatus="status">
<h:outputText value="#{item.title}: "/>
<!-- I want to re-render only a single one of these fields -->
<h:outputText id="valueContainer" value="#{item.value}"/><br/>
</ui:repeat>
</h:form>
Run Code Online (Sandbox Code Playgroud)
现在,我想使用AJAX(例如,索引为1的元素)重新渲染(仅)此列表valueContainer中的特定元素.我已经尝试过所有这些组合而没有任何运气:
<!-- Works, but renders all items: -->
<f:ajax render=":form"/>
<!-- This is what I actually want to achieve (does not work, comp. not found): -->
<f:ajax render=":form:repeatContainer:1:valueContainer"/>
<!-- Does not work (component not found): -->
<f:ajax render=":form:repeatContainer"/>
<!-- Does not work (component …Run Code Online (Sandbox Code Playgroud) 码:
<ui:repeat var="obj" value="#{demo2Bean.someList}">
<h:panelGroup id="foo" />
<h:dataTable id="bar" />
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)
结果:
<span id="j_idt55:0:foo"></span>
<table id="j_idt55:0:bar"><tbody><tr><td></td></tr></tbody></table>
<span id="j_idt55:1:foo"></span>
<table id="j_idt55:0:bar"><tbody><tr><td></td></tr></tbody></table>
Run Code Online (Sandbox Code Playgroud)
如您所见,datatables的id与'j_idt55:0:bar'相同,但对于panelGroups,它增长(应该如此):'j_idt55:0:foo','j_idt55:1:foo'.为什么会这样?