2017-01-30 3 views
1

На мой взгляд, у меня отключен p:inputText, показывая некоторую информацию о адресе. Значение p:inputText устанавливается слушателем dialogReturnonAdresseDialogReturn(). Помимо этого inputText у меня есть несколько других полей ввода (p:selectOneMenu, p:inputText).detectUnsavedChanges on dialogReturn event

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

Моя проблема теперь в том, что я хочу это предупреждение также, когда слушатель dialogReturn меняет значение поля inputText - но этого не происходит!

Так что мой вопрос: как я могу это достичь?

Здесь p:inputText с p:commandButton помощью диалогового primefaces рамки:

<ui:composition> 

    <ui:define name="head"> 
     <h:outputScript name="js/detectUnsavedChanges.js"/> 
    </ui:define> 

    <ui:define name="content"> 
     <h:form id="form"> 
      <p:panelGrid> 
       <p:row> 
        <p:column> 
         <p:commandButton id="save" value="Save" ajax="false" action="#{bean.save}"/> 
        </p:columns> 
       </p:row> 
      </p:panelGrid> 

      <p:panelGrid> 
       <p:row> 
        <p:column> 
         <p:inputText id="adresse" disabled="true" size="50" 
            value="#{bean.adresse}"/> 
         <p:commandButton id="adresseAuswahl" 
             title="Adresse bearbeiten" 
             process="@this" 
             actionListener="#{bean.showAdresseDialog}"> 
          <p:ajax event="dialogReturn" update="adresse" 
            listener="#{bean.onAdresseDialogReturn}"/> 
         </p:commandButton> 
        </p:columns> 
       </p:row> 
      </p:panelGrid> 
     </h:form> 
    </ui:define> 
</ui:composition> 

Здесь dialogReturn слушателя в моем бобе:

public void onAdresseDialogReturn(SelectEvent e) { 
    final Adresse adresse = (Adresse) e.getObject(); 
    boolean changedAdresse = Optional.ofNullable(adresse).isPresent() 
      && !getAdresse().equals(adresse); 
    if (changedBauvorhabenAdresse) { 
     // Adresse has been changed 
     setAdresse(adresse); 
    } 
} 

Вот код JavaScript, как упомянуто BalusC из How to detect unsaved data in form when user leaves the page?:

$(function() { 
    // Set the unload message whenever any input element get changed. 
    $(':input').on('change', function() { 
     setConfirmUnload(true); 
    }); 

    // Turn off the unload message whenever a form get submitted properly. 
    $('form').on('submit', function() { 
     setConfirmUnload(false); 
    }); 
}); 

function setConfirmUnload(on) { 
    var message = "You have unsaved data. Are you sure to leave the page?"; 
    window.onbeforeunload = (on) ? function() { return message; } : null; 
} 

My Environment: Primefaces 6.0 on Wildfly.10.0.Final

Любые подсказки приветствуются - Спасибо!

ответ

0

Попробуйте добавить атрибут oncomplete к вашему p:ajax внутри commandButton. я на самом деле не знаю, если вы можете поместить p:ajax компонент внутри p:commandButton однако в OnComplete атрибута следует вызвать setConfirmUnload (правда), как это:

    <p:commandButton id="adresseAuswahl" 
            title="Adresse bearbeiten" 
            process="@this" 
            actionListener="#{bean.showAdresseDialog}"> 
         <p:ajax event="dialogReturn" update="adresse" 
           listener="#{bean.onAdresseDialogReturn}" oncomplete="setConfirmUnload(true)"/> 
        </p:commandButton> 
+0

Параметр 'р: commandButton' уже ajaxified по умолчанию как упомянутых в витрине PrimeFaces и документации – Kukeltje

+0

Я так и думал. Я бы использовал компонент 'p: ajax' внутри компонента' dialog', слушающего событие ** close **. Как это: ' <р: Ajax события = "закрыть" обновление = "Adresse" слушатель = "# {} bean.onAdresseDialogReturn" OnComplete = "setConfirmUnload (истина)"/> ' –

+0

Благодаря @EniSinanaj - отлично работает! – raho