我现在有一个适当的解决方法。
Primefaces 6.0 现在有一个名为 autoWidth 的新字段,默认设置为 true,您可以设置为 false。
如果您按照上述某些回复所说的进行操作并将其设置为 false,那么您所做的就是与您的应用程序 css 玩轮盘赌。通过将其设置为 false,primefaces 将由您来管理宽度。您可以通过样式属性或应用程序中的某些 css 类在 selectOneMeny 上显式设置宽度。
但这不是这个问题的意义所在,这个问题是关于不为下拉菜单指定任何宽度的默认行为导致我们的下拉菜单通常对于其中的标签来说太小了。
所以我们真正想要的是让 autoWidth 正常工作。
最后,我查看了组件和渲染器,很明显自动宽度机制在后端不起作用。后端仅构建一些类似 JSON 的数据,primefaces javascript 构建器可以使用这些数据在浏览器上正确调整小部件的行为。
如果您查看 primefaces 6.0 源代码,则该错误位于 META-INF\resources\primefaces\forms
搜索显示以下内容的代码:
PrimeFaces SelectOneMenu 小部件
在这个 javascript 函数中寻找这样的代码块:
_render: function() {
if(this.cfg.autoWidth) {
在这部分代码中,您的错误是以下行:
this.jq.css('min-width', this.input.outerWidth());
在这里,我应用了以下补丁,希望它可以使下拉框与最大标签一样胖:
_render: function() {
if(this.cfg.autoWidth) {
// BEGIN: PATCHING
// ORIGINAL CODE:
// this.jq.css('min-width', this.input.outerWidth());
// BUGFIX:
// (a) compute the original min-with primefaces 6.0 would put on the root div
var primefacesBugWidth = this.input.outerWidth();
// (b) compute the length of the hidden select element with all the labels inside of it
var widthOfHiddenDivWithSelectLabels = this.jq.find('div select').width();
var widthOfTheDropDownTriangle = this.jq.find('.ui-selectonemenu-trigger.ui-state-default.ui-corner-right').width();
var widthOfLabelPlusTraingle = widthOfHiddenDivWithSelectLabels + widthOfTheDropDownTriangle;
// (c) we will use whichever length is longer
// in bug-fixed primefaces version the outerWidth should be computed correctly
// but this seems not to be the case
var maxWidthOfTwoPossibleOptions = primefacesBugWidth > widthOfLabelPlusTraingle ? primefacesBugWidth : widthOfLabelPlusTraingle;
this.jq.css('min-width', maxWidthOfTwoPossibleOptions);
// END: PATCHING
}
}
上面代码的想法是:(a)查看带有所有标签的隐藏 div 并获取该 div 的宽度(b)将素面三角形朝下所需的宽度添加到该长度(c)比较我们的宽度计算到 primefaces 建议的值,而且似乎太小了
注意:要安装补丁,您必须复制 SelectOneWidget 的所有 Primaces 代码。将其添加到您控制下的 javascript 文件中。确保仅在加载 primefaces javascript 文件后运行 javascript 文件的编译。
通常,primefaces 是在 HEAD 处渲染的。因此,如果您将 jasvacript 作为身体的最后一个元素,您应该没问题。
修补对我来说工作正常。这是我不喜欢维护的代码。