2013-09-05 3 views
1

У меня сложная форма, где пользователь заполняет несколько полей и имеет два варианта: сгенерировать файл лицензии или сохранить изменения. Если пользователь нажимает кнопку генерации файла лицензии без сохранения изменений, я представляю небольшой компонент с сообщением об ошибке, которое просит его сохранить до генерации лицензии. Чтобы отобразить компонент с предупреждающим сообщением, я хочу использовать ajax, чтобы избежать отображения всей страницы только для отображения компонента предупреждения. Конечно, если изменения были сохранены, тогда предупреждение не требуется, и я перенаправляю пользователя на другую страницу. У меня есть прослушиватель изменений в сменных полях, чтобы определить, когда было сделано изменение. То, что я не знаю, это условное выполнение. «Render с ajax, если несохраненная ИЛИ перенаправляется, если сохранена». Вот логикаПрограммно контролировать, какие компоненты должны обновляться ajax

if(saved){ 
    redirect(); 
}else{ 
    ajax.renderWarning() 
} 

--EDIT-- Я собираюсь добавить больше информации, потому что я понял, что я ухожу вещи слишком открытыми концами. Вот пример обновляемого поля.

<h:inputText name="computername3" value="#{agreement.licenseServerBeans[2].computerId}" valueChangeListener="#{agreement.fieldChange}"> 
    <rich:placeholder value="Add Computer ID"/> 
</h:inputText> 

The() боб fieldChange метод

public void fieldChange(ValueChangeEvent event) { 
    change = true; //change is a boolean, obviously :P 
} 

Вот генерации лицензии кнопка JSF

<h:commandLink action="#{agreement.generateLicenseFile}"> 
    <span class="pnx-btn-txt"> 
     <h:outputText value="Generate License File" escape="false" /> 
    </span> 
</h:commandLink> 

Вот метод generateLicenseFile()

public String generateLicenseFile(){ 
    ....//lots of logic stuff 
    return "/licenseGenerated.xhtml?faces-redirect=true"; 
} 

ответ

3

Используйте PartialViewContext#getRenderIds(), чтобы получитьизменяемый набор идентификаторов клиентов, которые должны быть обновлены по запросу текущего АЯКС (это точно так же, как вы бы указать в <f:ajax render>, но затем в виде абсолютных идентификаторов клиента без префикса :):

if (saved) { 
    return "/licenseGenerated.xhtml?faces-redirect=true"; 
} 
else { 
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("formId:messageId"); 
    return null; 
} 

Возвращение null заставляет его повторно отображать один и тот же вид. Вы даже можете добавить его в качестве сообщения глобальных лиц и дать команде ajax ссылку <h:messages> в рендеринг.

if (saved) { 
    return "/licenseGenerated.xhtml?faces-redirect=true"; 
} 
else { 
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(...)); 
    return null; 
} 

с

<h:messages id="messages" globalOnly="true" /> 
... 
<f:ajax render="messages" /> 
+0

Вернувшиеся нуль не обновит всю страницу? – Nacho321

+0

Нет, если вы отправляете запрос ajax на первое место, нет. После этого вы полностью контролируете атрибут ''. Если вы не отправляли запрос ajax на первое место, он действительно «обновит» страницу (не потому, что он вернул «null», а просто потому, что на первом месте это синхронный запрос (не-ajax)). – BalusC

+0

Wooooow! Это полностью взорвало мой разум! Еще раз спасибо, BalusC! – Nacho321

Смежные вопросы