Primefaces Lightbox的widgetVar干扰ui:重复

时间:2012-11-02 16:46:00

标签: jsf-2 primefaces

我有一个<ui:repeat>遍历List<String>,并使用<p:commandButton>中当前字符串的值创建<p:lightBox>
但是当我向widgetVar的{​​{1}}属性添加<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>

这是支持bean:

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;
   }

}

2 个答案:

答案 0 :(得分:6)

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等方式引用各个灯箱。


对具体问题

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

答案 1 :(得分:0)

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

我必须使用语法:

PF('whatever0')

由于primefaces如何命名widgetvar。