JSF 2: страница не перерисовывается по запросу AJAX (@all и явные идентификаторы) - PullRequest
0 голосов
/ 07 декабря 2011

Я пытаюсь реализовать простой переключатель скинов RichFaces 4, поэтому весь код выполняет установку нового свойства String для bean-компонента и повторное отображение всего представления. Вот JSF:

  <rich:panel styleClass="shadow">
    ...
    <h:form style="float: right;">
      <h:outputText value="Skin:&#160;" />
      <h:selectOneMenu value="#{skinBean.skin}" id="skin-selector">
        <f:ajax event="change" execute="@form" render="@all" listener="#{skinBean.listener}" />
        <f:selectItem itemValue="DEFAULT" itemLabel="Default" />
        <f:selectItem itemValue="classic" itemLabel="Classic" />
        <f:selectItem itemValue="blueSky" itemLabel="Blue Sky" />
        <f:selectItem itemValue="deepMarine" itemLabel="Deep Marine" />
        <f:selectItem itemValue="emeraldTown" itemLabel="Emerald Town" />
        <f:selectItem itemValue="japanCherry" itemLabel="Japan Cherry" />
        <f:selectItem itemValue="ruby" itemLabel="Ruby" />
        <f:selectItem itemValue="wine" itemLabel="Wine" />
      </h:selectOneMenu>
    </h:form>
  </rich:panel>

Вот боб кожи:

@Named
@SessionScoped
public class SkinBean implements Serializable
{
    private static final long serialVersionUID = 7477768262527797286L;

    private static final Logger log = Logger.getLogger(SkinBean.class);

    private String skin;

    @PostConstruct
    public void init()
    {
        log.info("Initializing skin bean!");

        // default
        this.skin = "wine";
    }

    @PreDestroy
    public void remove()
    {
        log.info("Removing skin bean!");
    }

    public String getSkin()
    {
        return skin;
    }

    public void setSkin(String skinName)
    {
        log.info("Setting skin to " + skinName);

        this.skin = skinName;
    }

    public void listener(AjaxBehaviorEvent abe)
    {
//      log.info("Skinning event!" + abe);
    }
}

Войти изменение выбора:

07:34:49,869 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After RESTORE_VIEW 1
07:34:49,870 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before APPLY_REQUEST_VALUES 2
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After APPLY_REQUEST_VALUES 2
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before PROCESS_VALIDATIONS 3
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After PROCESS_VALIDATIONS 3
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before UPDATE_MODEL_VALUES 4
07:34:49,872 INFO  [com.company.project.skin.SkinBean] (http--127.0.0.1-8080-5) Setting skin to classic
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After UPDATE_MODEL_VALUES 4
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before INVOKE_APPLICATION 5
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After INVOKE_APPLICATION 5
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before RENDER_RESPONSE 6
07:34:50,226 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After RENDER_RESPONSE 6

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

Кто-нибудь знает, почему представление не обновляется? Я также попробовал несколько идентификаторов вместо render="@all", например render=":repo-form" (вне формы переключателя), но ничего не происходит. Поиск ошибок также не выявил ничего полезного. Невозможность обновить даже явный идентификатор заставляет меня думать, что это что-то другое ...?

Примечание : я использую Mojarra 2.0.4 на JBoss AS 7.0.1.

Спасибо

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

попробуйте установить скин, используя полный запрос, а не Ajax:

<rich:panel styleClass="shadow">
    ...
    <h:form style="float: right;">
      <h:outputText value="Skin:&#160;" />
      <h:selectOneMenu value="#{skinBean.skin}" id="skin-selector" onchange="submit()">
        <f:selectItem itemValue="DEFAULT" itemLabel="Default" />
        <f:selectItem itemValue="classic" itemLabel="Classic" />
        <f:selectItem itemValue="blueSky" itemLabel="Blue Sky" />
        <f:selectItem itemValue="deepMarine" itemLabel="Deep Marine" />
        <f:selectItem itemValue="emeraldTown" itemLabel="Emerald Town" />
        <f:selectItem itemValue="japanCherry" itemLabel="Japan Cherry" />
        <f:selectItem itemValue="ruby" itemLabel="Ruby" />
        <f:selectItem itemValue="wine" itemLabel="Wine" />
      </h:selectOneMenu>
    </h:form>
</rich:panel>

С уважением, Palo

0 голосов
/ 07 декабря 2011

Полагаю, вы пытаетесь сделать что-то вроде здесь .Извините, что спросил, но вы уверены, что вы подключили свой «SkinBean» к скину RichFaces в файле web.xml, используя параметр «org.richfaces.skin» и EL?

Потому что ваш код выглядит довольно хорошо,Может быть, я бы попробовал событие «onchange» вместо «change», но так как у вас есть лог обновление атрибута ...

...