Jsf remoteCommand之后未设置selectBooleanCheckbox
我有一个remmote命令,它在加载项目后更新列表,并选中repeat render SelectBoolean复选框。但是,复选框中的值设置不正确,所有值都未选中。在某些项目旁边,选定属性(布尔值)设置为true 如果我只是在加载列表后在backingbean中设置一个项,那么它只对该项有效。有什么问题吗 index.xhtmlJsf remoteCommand之后未设置selectBooleanCheckbox,jsf,primefaces,Jsf,Primefaces,我有一个remmote命令,它在加载项目后更新列表,并选中repeat render SelectBoolean复选框。但是,复选框中的值设置不正确,所有值都未选中。在某些项目旁边,选定属性(布尔值)设置为true 如果我只是在加载列表后在backingbean中设置一个项,那么它只对该项有效。有什么问题吗 index.xhtml <h:form> <h:panelGroup id="itemsHolder"> <h:pan
<h:form>
<h:panelGroup id="itemsHolder">
<h:panelGrid rendered="#{backingBean.items != null}">
<h:selectBooleanCheckbox value="#{backingBean.item.selected}" disabled="#{backingBean.rendered}" /> #{backingBean.item.name}
<ui:repeat value="#{backingBean.items.toArray()}" var="option" >
<h:selectBooleanCheckbox value="#{option.selected}" disabled="#{backingBean.rendered}" />
#{option.name}
<br />
</ui:repeat>
</h:panelGrid>
</h:panelGroup>
<p:remoteCommand rendered="#{backingBean.rendered}"
name="initItems"
actionListener="#{backingBean.initItems()}"
process="@this"
update="itemsHolder"/>
</h:form>
<ui:fragment rendered="#{backingBean.rendered}">
<script>
$(document).ready(function () {
setTimeout(function () {
initItems();
}, 3000);
});
</script>
</ui:fragment>
#{backingBean.item.name}
#{option.name}
$(文档).ready(函数(){
setTimeout(函数(){
initItems();
}, 3000);
});
BackingBean.java
@Component
@ManagedBean
@Scope("view")
public class BackingBean {
private boolean rendered = true;
private Set<Item> items;
private Item item;
public void initItems() {
items = new LinkedHashSet<>();
items.add(new Item("item 1", true, "1"));
items.add(new Item("item 2", false, "2"));
items.add(new Item("item 3", true, "3"));
item = new Item("lonely item", true, "4");
}
//Getters and setters
}
@组件
@ManagedBean
@范围(“视图”)
公共类BackingBean{
私有布尔值=真;
私人设置项目;
私人物品;
公共物品(){
items=新LinkedHashSet();
项目。添加(新项目(“项目1”,正确,“1”);
添加(新项目(“项目2”,假,“2”));
项目。添加(新项目(“项目3”,正确,“3”);
项目=新项目(“单独项目”,真,“4”);
}
//接球手和接球手
}
更新:
我在一个沙箱中创建了一个真实代码的副本,我仍然无法复制,我想我必须从真实代码中添加更多依赖项。我已经重新创建了您的案例,并且它与以下简单的托管bean一起工作得很好
@ManagedBean(name = "bean")
@ViewScoped
public class YourBean implements Serializable {
List<YourItem> items=new ArrayList<>();
YourItem anItem=new YourItem();
@PostConstruct
public void init() {
System.out.println("Bean is created");
//initialize items
anItem.setSelected(false);
//add 5 items to list
for (int i=0;i<5;i++){
YourItem item=new YourItem();
item.setSelected(false);
items.add(item);
}
}
public void onUpdateItems(){
System.out.println("Items will be updated...");
anItem.setSelected(true);
//modify 1st and 3rd item
items.get(0).setSelected(true);
items.get(2).setSelected(true);
//remove 4th item
items.remove(3);
}
public List<YourItem> getItems() {
return items;
}
public void setItems(List<YourItem> items) {
this.items = items;
}
public YourItem getAnItem() {
return anItem;
}
public void setAnItem(YourItem anItem) {
this.anItem = anItem;
}
}
将您的代码与此示例进行比较。很可能在更新
项目列表的托管bean方法中存在问题,或者更新h:panelGroup
的方式存在问题,远程命令在哪里?更好的是,你的代码在哪里?我将这段代码添加到另一个项目中,以创建最小的、可验证的示例,但我无法复制它。问题是这个项目有太多的依赖项和框架,这需要一段时间。到目前为止,这个问题只发生在我当地的环境中。我完成任务后会回来的,谢谢你的时间。嗨,杜桑,我试着在另一个项目中复制它,实际上正如你所怀疑的那样。我认为我应该继续添加主项目的依赖项,直到我能够复制它。
<h:form id="form">
<h:panelGroup id="itemHolder">
<h:panelGrid rendered="#{bean.items != null}">
<h:selectBooleanCheckbox value="#{bean.anItem.selected}" />
<ui:repeat value="#{bean.items}" var="item">
<h:selectBooleanCheckbox value="#{item.selected}" />
#{item.selected}
<br />
</ui:repeat>
</h:panelGrid>
</h:panelGroup>
<p:remoteCommand name="startUpdate"
actionListener="#{bean.onUpdateItems()}"
update=":form:itemHolder"/>
<p:commandButton value="Update items" onclick="startUpdate();"/>
</h:form>