Primefaces自动完成菜单在错误的位置打开

时间:2014-03-07 07:57:09

标签: primefaces menu autocomplete dialog position

我有一些详细信息的对话框。打开对话框时,信息显示为非可编辑标签。用户可以打开editabile网格按钮,将渲染参数更改为panelGrid,nonedababile设置为flase,editabile为true。

在可编辑网格中,我有自动完成组件,菜单显示在错误的位置。自动完成菜单的左侧和顶部属性是相对于主体设置的,而不是对话框(如对话框的左上角位于0,0)。只有当我第一次打开对话框时才会发生这种情况,如果我将其关闭并再次打开,则菜单会在文本框字段下方正确打开。

<p:dialog ... appendTo="@(body)">
  <h:form>  
    <p:outputPanel id="opX">
      <p:panelGrid rendered="#{x}" > 
        // non editabile content
      </p:panelGrid>

      <p:panelGrid rendered="#{!x}" >
        // editabile content
        ... 
        <p:autoComplete value="#{xBean.acValue}"  completeMethod="#{xBean.acMenu}" />              
        ...
      </p:panelGrid>
    </p:outputPanel>
    <p:commandButton action="#{x=!x;}" process="@this" update="opX" />
  </h:form>
</p:dialog>

知道为什么会这样吗? 此外,我遇到了自动完成的问题,它在之后呈现时会有列(或在某些更改后更新)。 我收到错误:

  

itemLabel =“#{sifra.value}”:在类型上找不到属性“值”   java.lang.String中

<p:autoComplete value="#{xBean.acValue}" completeMethod="#{xBean.acMenu}" var="sifra" itemValue="#{sifra.value}" itemLabel="#{sifra.value}" >
  <p:column><b>#{sifra.value}</b></p:column>
  <p:column>#{sifra.name}</p:column>
</p:autoComplete>

 public List<GeneralListDto> acMenu(String inputValue) {
   try {
     GeneralListDto x = calling sme web service;
     return x;
   } 
   catch(Exception e){
     ...
   }
  }

public class GeneralListDto {

public GeneralListDto(){

}

public GeneralListDto(String n, String v, String d){
    this.name = n;
    this.value = v;
    this.description = d;
}

private String value;
private String name;
private String description;

getter and setters
    ....

}

1 个答案:

答案 0 :(得分:0)

不幸的是我无法重现你的问题,但这里有一些提示:

  • 尝试将表单放在对话框之外
 
     <h:form id="dialogForm">  
        <p:dialog widgetVar="dlgWV" appendToBody="true">
        </p:dialog>
     </h:form>
  • 尝试在打开对话框之前更新表单,这样可能会“重新计算位置”
    <p:commandButton update=":dialogForm" oncomplete="dlgWV.open()" />
  • 至于itemLabel="#{sifra.value}": Property 'value' not found on type java.lang.String。 您需要为sifra对象实现转换器。

  • 有时,如果您在自动填充建议面板中有太多结果,您可能会遇到查看问题,例如位置和一些不可见的项目,在这种情况下,您有两个解决方案,CSS或overrride the position of the panel


CSS

   .ui-autocomplete-panel {
       max-width: 400px;
       z-index: 2012;
       overflow:auto;
       height: 200px;
    }

JS

PrimeFaces.widget.AutoComplete.prototype.alignPanel = function() {
    var fixedPosition = this.panel.css('position') == 'fixed',
    win = $(window),
    positionOffset = fixedPosition ? '-' + win.scrollLeft() + ' -' + win.scrollTop() : null,
    panelWidth = null;

    if(this.cfg.multiple) {
        panelWidth = this.multiItemContainer.innerWidth() - (this.input.position().left - this.multiItemContainer.position().left);
    }
    else {
        panelWidth = this.input.innerWidth();
    }

    this.panel.css({
                    left:'',
                    top:'',
                    width: panelWidth
            })
            .position({
                my: 'left top'
                ,at: 'left bottom'
                ,of: this.input
                ,collision: 'none',
                offset : positionOffset
            });
}

希望这有帮助。