Le rendu d'une autre forme par ajax provoque la perte de l'état de sa vue, Comment puis-je ajouter ceci en arrière?

j'ai

<h:form>
    <h:commandLink action="#{my_fake_ajax_link}">
        <h:outputText value="Link" />
        <f:ajax render=":mydiv" />
    </h:commandLink>
</h:form>

<h:panelGroup layout="block" id="mydiv">
    <h:form>
        <h:commandLink action="#{mybean.delete(0)}">
            <h:outputText value="Here" />
            <f:ajax render="@form" />
        </h:commandLink>
    </h:form>
</h:panelGroup>

Quand je clique une fois sur "my_fake_ajax_link", puis j'ai cliquer deux fois sur le lien "supprimer". Ce n'est qu'un exemple. Je n'ai pas de ce cas réel. J'ai plusieurs formulaires sur une page et je ne peux pas les ajouter tous en un seul formulaire.

j'ai vérifié que le problème, c'est:

  • Lorsque vous cliquez sur "my_fake_ajax_link", le mydiv rafraîchissements avec ajax comme il se doit.
  • ViewState de l'actualisation formulaire en ajax est manquant.

comment ajouter le ViewState? Comment puis-je le faire fonctionner sans utiliser un seul formulaire? Ça ressemble à un bug JSF pour moi. Je ne veux pas rafraîchir cette div automatiquement avec

jQuery("#mydiv").load(document.location.href);

mais je le ferai dans le pire des cas.

13
demandé sur BalusC 2011-10-18 16:39:17

2 réponses

C'est un problème connu dans l'auto-inclus jsf.js bibliothèque de JSF qui gère les réponses ajax. Voir aussi JSF éd. 790 ce qui est corrigé dans le prochain JSF 2.3. En attendant, avec JSF 2.0/2.1/2.2, vous devez spécifier explicitement L'ID de l'autre <h:form> à l'intérieur de la render attribtue pour déclencher la bonne plus de l'état d'affichage.

<h:form>
    <h:commandLink action="#{my_fake_ajax_link}">
        <h:outputText value="Link" />
        <f:ajax render=":mydiv :mydivForm" />
    </h:commandLink>
</h:form>

<h:panelGroup layout="block" id="mydiv">
    <h:form id="mydivForm">
        <h:commandLink action="#{mybean.delete(0)}">
            <h:outputText value="Here" />
            <f:ajax render="@form" />
        </h:commandLink>
    </h:form>
</h:panelGroup>

Non, cela ne provoque pas de duplication des lignes aériennes ou des balises dans la réponse ajax. Alternativement, utiliser OmniFaces fixviewstate.js.

Voir aussi:

22
répondu BalusC 2017-05-23 10:30:42

Solution:

vous devez d'Abord créer un onevent handler pour le bouton qui envoie la requête ajax:

<h:form id="newComment">
    <h:commandButton id="saveNewComment" action="#{postBean.actionSaveNewCommentAjax}" value="#{rb['speichern']}">
        <f:ajax execute="@form" render=":commentsBox" onevent="function(data) { fixOtherFormsViewState(data, 'newComment') }" />
    </h:commandButton>
</h:form>

alors vous devez déclarer ces méthodes javascript qui prendront la valeur de viewState correcte et l'ajouteront à toutes les formes qui ne l'ont pas:

<h:outputScript>
function fixOtherFormsViewState(data, goodFormId) {
    if (data.status != "success") {
        return;
    }

    var viewState = jQuery("#" + goodFormId + " input[name='javax.faces.ViewState']").val();
    jQuery("form:not(:contains(input[name='javax.faces.ViewState']))").each(function (idx, elem) {
        var form = jQuery(elem);
        var input = jQuery("&lt;input type='hidden' name='javax.faces.ViewState' /&gt;").val(viewState);
        form.append(input);
    });
}
</h:outputScript>
0
répondu Igor Mukhin 2013-12-09 16:31:10