InplaceSelect для объектов, а не строк - PullRequest
0 голосов
/ 26 октября 2011

Форма

 <h:inputText value="#{BackingBean.firstString}" />
 <h:inputText value="#{BackingBean.secondString}" />
 <rich:inplaceSelect value="#{BackingBean.myText}" defaultLabel="select">
  <f:selectItems value="#{???}" />
 </rich:inplaceSelect>

BackingBean

private List<MyText> myText;
private String firstString;
private String secondString;

MyText

private String id
private String desc
private String text

Я хочу выбрать один MyText из списка, в то время как в inplaceSelect, я хочу показать только одно поле MyText. Каков наилучший способ достичь этого?

Ответы [ 3 ]

1 голос
/ 26 октября 2011

Во-первых, вам нужно Converter для преобразования между MyText и String. Исходя из истории ваших вопросов, я понимаю, что вы используете JSF 1.2, поэтому я дам целевой ответ JSF 1.2.

Converter должен в основном выглядеть следующим образом (это всего лишь пример, прочитайте комментарий о том, как вы должны его реализовать):

public class MyTextConverter implements Converter {

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        // Write code here to convert MyText to its unique String representation.
        return String.valueOf(((MyText) value).getId());
    }

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        // Write code here to convert unique String representation of MyText to MyText object.
        return myTextService.find(Long.valueOf(value));
    }

}

Зарегистрируйте это следующим образом в faces-config.xml:

<converter>
    <converter-for-class>com.example.model.MyText</converter-for-class>
    <converter-class>com.example.converter.MyTextConverter</converter-class>
</converter>

Тогда вы можете использовать следующие данные:

<rich:inplaceSelect value="#{bean.myText}" defaultLabel="select">
    <f:selectItems value="#{bean.myTextItems}" />
</rich:inplaceSelect>

с

private MyText myText;
private List<SelectItem> myTextItems;

@PostConstruct
public void init() {
    myTextItems = new ArrayList<SelectItem>();

    for (MyText myText : myTextService.list()) {
        myTextItems.add(new SelectItem(myText, myText.getText()));
    }
}

// ...
0 голосов
/ 26 октября 2011
<f:selectItems
    value="#{BackingBean.myTextID}"
    var="value"
    itemLabel="#{value.desc}"
    itemValue="#{item.id}"
    />

или любые другие атрибуты, которые вам нужны, чтобы быть меткой / значением элемента. Требуется JSF 2.

0 голосов
/ 26 октября 2011

У вас бэк-бин, так как у вас есть <rich:inplaceSelect value="#{backingBean.myText}", измените

private List<MyText> myText;

до

private MyText myText;

И добавить список SelectItem s в компоненте:

private List<SelectItem> selItems;

И затем вы можете заполнить этот список SelectItem s либо в конструкторе, либо в методе с (@PostConstruct).

Вы можете использовать конструктор SelectItem(Object value, String label).

selItems.add(new SelectItem(myTextObj, myTextObj.text)); //or id or desc instead of text
//...

А потом в представлении:

<f:selectItems value="#{backingBean.selItems}" />
...