IceFaces дублируют записи в комбо, меню после изменения макета - PullRequest
0 голосов
/ 25 июля 2011

Мое приложение на основе IceFaces 1.8 запускается с очень простого xhtml, который включает другой, основанный на свойстве бина.Это свойство связано с элементом комбо, который включен в каждую страницу.Если пользователь выбирает макет из этого комбо, страница обновляется до нового макета.

Все нормально, за исключением того, что после каждого изменения макета страницы элементы в комбо селектора макетов дублируются, дублируются ии т. д.

Это "мультиплексор" xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ice="http://www.icesoft.com/icefaces/component">

    <ui:include src="#{system.layout}">
    </ui:include>

</html>

И это селектор макетов, который включен в каждый макет xhtml:

  <ice:form id="layoutSelectForm">
        <ice:outputLabel for="layoutSelector">#{msgs['LayoutSelect.Label']}: </ice:outputLabel>
        <ice:selectOneMenu id="layoutSelector" binding="#{layoutSelect.som}" value="#{layoutSelect.selectedLayout}" 
            valueChangeListener="#{layoutSelect.processValueChange}" partialSubmit="true">
            <f:selectItems value="#{layoutSelect.allLayouts}" />
        </ice:selectOneMenu >
  </ice:form>

Здеськод бина LayoutSelect:

public class JSFLayoutSelect implements InitializingBean, ValueChangeListener {
    private EventManager eventManager;
    private String mainApplFrmURL;
    private HtmlSelectOneMenu som;
    public List<SelectItem> allLayouts;
    private String selectedLayout;

        @Override
    public void processValueChange(ValueChangeEvent event)
            throws AbortProcessingException {
        eventManager.publish("layout-select/change", event.getNewValue());
        logger.info("Layout changed event occured: " + event.getNewValue());

        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect(mainApplFrmURL);
        } catch (IOException e) {
            logger.error(e.getMessage());
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        allLayouts = new ArrayList<SelectItem>();
        allLayouts.add(new SelectItem("dev", "Core Dev"));
        allLayouts.add(new SelectItem("classic", "Core Classic"));
        allLayouts.add(new SelectItem("modern", "Core Modern"));
        selectedLayout = "dev";
    }

    public List<SelectItem> getAllLayouts() {
        return allLayouts;
    }

    public String getSelectedLayout() {
        return selectedLayout;
    }

        /* some unimportant methods are not here */
}

  <bean name="layoutSelect" class="hu.hgap.comp.impl.JSFLayoutSelect" scope="session">
    <property name="eventManager" ref="SessionEventManager"/>
     <property name="mainApplFrmURL" value="/ICEFacesSpringDemoV2/secured/ApplFrm.faces" />
  </bean>

Можете ли вы сказать мне, что мне делать, чтобы избежать дублирования комбо-записей?Я вижу, что после изменения макета снова отображается тот же самый комбо, и элементы комбо снова вставляются в него с сервера.

1 Ответ

0 голосов
/ 08 августа 2011

Как выглядит ваш боб? Какой объем у него есть?

У меня был похожий опыт с связыванием переменных в bean-объекте сеанса. Когда я переместил переменную в bean-компонент scopre запроса, проблема исчезла.

...