<f: selectItems> Атрибут пользовательской подсказки тега JSF - PullRequest
9 голосов
/ 21 марта 2012

Можно ли добавить атрибут «title» к тегу в JSF, например:

<f:selectItems value="#{foo.fooList}" title="{foo.fooDescription}"/>

Сгенерированный HTML:

<select>
    <option value="foo1" title="description1">foo ex1</option>
    <option value="foo2" title="description2">foo ex2</option>
</select>

Ответы [ 5 ]

5 голосов
/ 21 марта 2012

У меня нет элегантного решения, но оно может быть сделано. Я предполагаю, JSF 2+ и Facelets VDL.

Для управляемого компонента Foo:

@ManagedBean @RequestScoped
public class Foo {
  private List<SelectItem> fooList = Arrays.asList(
            new SelectItem("value1", "label1", "description1"),
            new SelectItem("value2", "label2", "description2"));

  public List<SelectItem> getFooList() {
    return fooList;
  }
}

Вы можете использовать JavaScript для установки атрибута title на узле DOM:

<h:selectOneMenu binding="#{requestScope.fooSelectOne}">
  <f:selectItems value="#{foo.fooList}" />
</h:selectOneMenu>
<script>
(function() {
  var selectName = '#{requestScope.fooSelectOne.clientId}';
  var kids = document.getElementsByName(selectName)[0]
                     .getElementsByTagName("option");
  var index = 0;
  <ui:repeat value="#{foo.fooList}" var="_opt">
  kids[index++].title = '#{_opt.description}'; //TODO: escape this
  </ui:repeat>
}());
</script>
1 голос
/ 26 мая 2016

Чтобы сгенерировать атрибут title в сгенерированном options, вы можете просто использовать атрибуты passthrough , например:

<f:selectItems value="#{values}" p:title="Your title here"/>
0 голосов
/ 20 ноября 2014

Атрибут itemDescription не будет отображаться в шве 2.2.

Лучшим решением было бы использование JavaScript для отображения всплывающей подсказки для каждого выбранного элемента.

 <script type="text\javascript">
   function getTooltip(id){
     var options = document.getElementById(id).options;
         for(var i = 0; i &lt; options.length; i++) {
            options[i].title = "description" + i;
         }
    }
 </script>

, если ваш идентификатор генерируется динамически или другим способом, например.

 <rich:dataTable value="#{mybean.list}">
   <h:selectOneMenu value="#{mybean.selectedValue}" onmouseover=getTooltip(this.id)>
     <f:selectitems value="#{mybean.selectlist}">
   </h:selectOneMenu>
 </rich:datatable>

Это решение будет работать для всех динамически генерируемых идентификаторов, а также для простых

0 голосов
/ 07 января 2013

Предположим, ваш <h:selectOneMenu такой, как показано ниже.

<h:form id="myForm">
  <h:selectOneMenu id="myCombo">
    <f:selectItems value="#{foo.fooList}"/>
  </h:selectOneMenu>
</h:form>

Теперь на window.onload вы можете перебрать option с и добавить title, как показано ниже

<script>
    window.onload = function() {
         var options = document.getElementById("myForm:myCombo").options;
         for(var i = 0; i &lt; options.length; i++) {
             options[i].title = "description" + i;
         }
    }
</script>
0 голосов
/ 21 марта 2012

Я думаю, что для тега f:selectItems такого атрибута (title) нет.У вас есть этот атрибут в виде простого тега option в HTML, но не в jsf.Я думаю, что вы должны использовать простой select тег вместо selectOneMenu, чтобы получить title значение.

...