我有一些详细信息的对话框。打开对话框时,信息显示为非可编辑标签。用户可以打开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
....
}
答案 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
});
}
希望这有帮助。