首頁>Program>source

我有

<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>

当我在" my_fake_ajax_link"上單击一次時,則必须在"删除"鏈接上單击两次.這仅仅是一个例子.我没有這个真實的案例.我在頁面上有多種表單,不能仅仅將所有表單添加為一个表單。

我檢查了問题所在,並且是:

  • When you click on "my_fake_ajax_link", the mydiv 使用應有的ajax重新整理。
  • 在ajax上重新整理的表單的ViewState丢失。

如何添加ViewState? 如何不使用一種表格就可以工作? 在我看来,這似乎是一个JSF錯誤.我不想使用

自動重新整理该div
jQuery("#mydiv").load(document.location.href);

但在最壞的情况下,我会尽可能的。

最新回復
  • 1月前
    1 #

    這是自動隨附的 jsf.js中的一个已知問题 處理ajax响應的JSF庫.另請參见即將發佈的JSF 2.3中已修複的JSF規範問题790.同時,在JSF 2.0 / 2.1 / 2.2中,您必须明確指定另一个 <h:form>的ID。 在 render內 觸發適当添加视圖狀態的屬性。

    <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>
    

    否,這不会在ajax响應中引起任何開銷或標記重複.或者,使用OmniFaces fixviewstate.js

    另請參见:

      Communication in JSF 2.0 - Ajax rendering of content which contains another form

      h:commandButton/h:commandLink does not work on first click, works only on second click

  • 1月前
    2 #

    解決方法:

    首先,您需要設置一个 onevent 發送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>
    

    然後,您需要宣告此javascript方法,该方法將采用正確的viewState值並將其添加到所有没有它的表單中:

    <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>
    

  • javascript:jQuery Deferred和對话框
  • python:比较两个CSV檔案並搜尋相似的專案