【问题标题】:<p:selectOneMenu> with bold labels for some items<p:selectOneMenu> 带有粗体标签的某些项目
【发布时间】:2016-06-22 16:37:24
【问题描述】:

我正在尝试使用 Primefaces“SelectOneMenu”,其中包含可以具有“普通”标签或“粗体”标签的项目。我尝试了 2 种不同的变体,但都没有按预期工作。

变体 1:

<p:selectOneMenu id="menu" value="#{selected}">
  <f:selectItems value="#{mySelectItems}"/>
</p:selectOneMenu>

public List<SelectItem> getMySelectItems() {
  List<SelectItem> list = new ArrayList<SelectItem>();
  for (...) {
    SelectItem item = new SelectItem(value, label);
    item.setEscape(false);
    if (...)
      item.setLabel("<b>" + item.getLabel() + "</b>");
    list.add(item);
  }
  return list;
}

这样我可以让菜单中的一些项目带有粗体标签,而有些则带有普通标签。问题:显示当前选择的字段将文本显示为“...”。文本似乎没有被转义,但它似乎不能显示为粗体,因为它位于 HTML 标签内。不过,我不知道如何才能去掉那个标签中的“”和“”。

变体 2:

<p:selectOneMenu id="menu" value="#{selected}" var="myClass">
  <f:selectItems value="#{myClasses}"/>
  <p:column>
    <h:outputText value="#{myClass.name}" styleClass="bold"/>
  </p:column>
</p:selectOneMenu>

public List<MyClass> getMyClasses() {
  List<MyClass> list = new ArrayList<MyClass>();
  ...
  return list;
}

使用这个变体,我还可以在菜单中为项目(目前是所有项目)添加粗体标签。问题是:显示当前选择的文本没有显示“myClass.getName()”,而是显示“myClass.toString()。菜单中的标签是正确的。有没有办法解决这个问题?

如果我写...

<f:selectItems value="#{myClasses}" var="myVar" itemValue="#{myVar.value}" itemLabel="#{myVar.name}"/>

相反,它不再将菜单中的项目显示为粗体,而是在当前选择的字段中使用 getName() 而不是 toString()。

有谁知道如何让我的想法按照我希望的方式发挥作用,或者对如何解决这个问题有更好的想法?

提前致谢!

【问题讨论】:

    标签: jsf primefaces selectonemenu


    【解决方案1】:

    在变体 2 中,您需要通过实现 javax.faces.convert.Converter 来为 MyClass 提供转换器。转换器只需要选择(它生成对象的字符串表示(实例的唯一 id)并在处理后将其转换回对象)。为了正确表示所选值,您需要将此属性添加到 selectItems:&lt;f:selectItems value="#{myClasses}" var="myVar" itemValue="#{myVar}" itemLabel="#{myVar.name}"/&gt;&lt;h:outputText styleClass="bold"... 仅对 selectItems 列表有效。要更改所选项目的样式,您需要将styleClass 添加到p:selectOneMenu。在你的情况下:

    <p:selectOneMenu id="menu" value="#{view.selection}" converter="#{view.myClassConverter}" 
        var="v" style="#{(view.selection.name eq 'bold-name') ? 'font-style: bold' : null}">
        <f:selectItems value="#{view.myClasses}" var="mc" 
            itemLabel="#{mc.name}" itemValue="#{mc}"/>
        <p:column>
            <h:outputText value="#{v.name}" style="#{(v.name eq 'bold-name') ? 'font-style: bold' : null}"/>
        </p:column>
        <p:ajax event="change" update="menu" process="@this"/>
    

    .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多