Primefaces widgetVar interfering with ui:repeat or ui:datata



我有一个<ui:repeat>,它迭代List<String>并在<p:lightBox>中使用当前字符串的值创建一个<p:commandButton>
但是当我将widgetVar添加到<p:lightBox>的属性中时,<p:commandButton>的值始终是上次迭代中的字符串。

有人可以解释会发生什么,并且(我需要widgetVar)也许指出一个解决方案吗?

这是我的 html:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
<ui:repeat var="thing" value="#{bugBean.things}">
<p:lightBox widgetVar="whatever">
<h:outputLink>
<h:outputText value="#{thing}" />
</h:outputLink>
<f:facet name="inline">
<h:form>
<p:commandButton action="#{bugBean.writeThing(thing)}"
value="#{thing}" />
</h:form>
</f:facet>
</p:lightBox>
</ui:repeat>
</h:body>
</html>

这是支持豆:

package huhu.main.managebean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class BugBean implements Serializable {
private static final long serialVersionUID = 1L;
List<String> things = new ArrayList<String>();
public BugBean(){
things.add("First");
things.add("Second");
things.add("Third");
}
public void writeThing(String thing){
System.out.println(thing);
}
public List<String> getThings() {
return things;
}
public void setThings(List<String> things) {
this.things = things;
}
}

widgetVar基本上生成一个窗口范围的 JavaScript 变量。你现在在 JavaScript 上下文中有效地做的是:

window['whatever'] = new Widget(lightboxElement1);
window['whatever'] = new Widget(lightboxElement2);
window['whatever'] = new Widget(lightboxElement3);
// ...

这样,JS中的whatever变量将仅引用最后一个变量。

基本上,您应该为每个它们提供一个唯一的名称,例如通过添加迭代索引:

<ui:repeat var="thing" value="#{bugBean.things}" varStatus="iteration">
<p:lightBox widgetVar="whatever#{iteration.index}">

这样它就变得有效:

window['whatever0'] = new Widget(lightboxElement1);
window['whatever1'] = new Widget(lightboxElement2);
window['whatever2'] = new Widget(lightboxElement3);
// ...

通过这种方式,您可以通过whatever0whatever1whatever2等来引用各个灯箱。


与具体问题无关:使用单个灯箱并在每次点击时更新其内容不是更容易吗?

最近我在升级到 primefaces 4.0 -> 5.1 时遇到了类似的问题

我不得不使用语法:

PF('whatever0')

由于素数命名小部件变量的方式发生了变化。

最新更新