3

最初の JSF2 プロジェクトの 1 つに twitter-boostrap を組み込もうとしています

私の質問は、編集ボタンをクリックすると、選択した情報を含むモーダルフォームが表示されるように、データテーブルから選択したインデックスを取得する方法です

私の考えでは、通常の html href タグを h:link に置き換えて、マネージド Bean で選択したレコードを設定するアクション イベントを追加できるようにすることでしたが、h:link の結果は「#myModal」参照を取得しません。 h:link の URL の末尾に「#myModal」がありません。

これが理にかなっていることを願っています

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

  <ui:composition template="WEB-INF/templates/default.xhtml">
    <ui:define name="content">
      <div class="well">
        <h2>Members</h2>
        <br />
        <h:panelGroup rendered="#{empty members}">
          <em>No registered members.</em>
        </h:panelGroup>

        <h:dataTable id="dataTable" var="_member" value="#{members.memberList}"
            rendered="#{not empty members}" styleClass="table table-striped table-bordered">
          <h:column>
            <f:facet name="header">Id</f:facet>
            #{_member.memberId}
          </h:column>
          <h:column>
            <f:facet name="header">Name</f:facet>
            #{_member.firstName}
          </h:column>
          <h:column>
            <f:facet name="header">Email</f:facet>
            #{_member.lastname}
          </h:column>
          <h:column>
            <f:facet name="header">Phone #</f:facet>
            #{_member.contactNumber}
          </h:column>
          <h:column>
            <f:facet name="header">REST URL</f:facet>
            <a href="#{request.contextPath}/rest/members/#{_member.memberId}">/rest/members/#{_member.memberId}</a>
          </h:column>
          <h:column>
            <f:facet name="header">Action</f:facet>
            <a href="#myModal" role="button" class="btn" data-toggle="modal">Edit</a>
          </h:column>
          <h:column>
            <f:facet name="header">Action</f:facet>
            <h:link href="#myModal"  role="button" class="btn" data-toggle="modal" value="Edit"></h:link>
          </h:column>
        </h:dataTable>
      </div>

      <!-- Button to trigger modal -->
      <a href="#myModal" role="button" class="btn" data-toggle="modal">Launch demo modal</a>

      <!-- Modal -->
      <div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
          <h3 id="myModalLabel">Modal header</h3>
        </div>
        <div class="modal-body">
          <p>One fine body…&lt;/p>
        </div>
        <div class="modal-footer">
          <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
          <button class="btn btn-primary">Save changes</button>
        </div>
      </div>
    </ui:define>
  </ui:composition>
</html>
4

1 に答える 1

2

同じ問題を抱えている人のために、これが私がそれを機能させる方法です:

  • 自分でjavascriptでモーダルを開く必要があります。
  • ページのリロード時にモーダルが消えたくない場合は、ページのリロード<f:ajax />を防ぐために使用する必要があります
  • 変数 (ここ#{_member}では:) をバッキング Bean に取得する唯一の方法は、ajax-listener で EL 式を評価することです

xhtml/javascript:

<h:form>
  <h:dataTable id="dataTable" var="_member" value="#{members.memberList}"
                                            rendered="#{not empty members}"
                                            styleClass="table table-striped table-bordered">
    <h:column>
       <f:facet name="header">Action</f:facet>
       <h:commandLink value="Edit">
           <!-- the listener sets the variable in backing bean and onevent opens the modal -->
           <!-- you also have to render the form inside the modal, so the values get updated with new ones from backing bean -->
           <f:ajax listener="#{ajaxBean.handleEvent}" onevent="openModal('myModal');" render=":modalForm" />
       </h:commandLink>
    </h:column>
  </h:dataTable>
</h:form>

<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <h:form id="modalForm>
       <div class="modal-header">
           <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
           <h3 id="myModalLabel">Modal header</h3>
       </div>
       <div class="modal-body">
          <p>Use backing Bean property here... <h:outputText value="#{ajaxBean.member.name}</p>
       </div>
       <div class="modal-footer">
           <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
           <button class="btn btn-primary">Save changes</button>
       </div>
    </h:form>
</div>
<script type="text/javascript">
    function openModal(modalName) {
       $(modalName).modal('show');
       return false;
    }
</script>

バッキング Bean:

package somePackage;

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;

@ManagedBean
public class AjaxBean {
    private Member member;



    public final void handleEvent(final AjaxBehaviorEvent event) {
        //get the member from the FacesContext.
        FacesContext context = FacesContext.getCurrentInstance();
        this.member = context.getApplication().evaluateExpressionGet(context, "#{_member}", Member.class);
    }

    public Member getMember() {
        return member;
    }

    public void setMember(Member member) {
        this.member = member;
    }
}

このように、モーダルが開き、モーダルの #{ajaxBean.member} を介して dataTable から #{_member} にアクセスできます。

「閉じる」ボタンを押すと、このように最初のクリックでモーダルが閉じないことがあります。もしそうなら、あなたはそれを置き換えることができます

<h:commandLink onclick="$(#myModal).modal('hide');" />

これを行うためのよりエレガントな方法があることはほぼ確実です。誰かが方法を知っているなら、彼/彼女から聞いてうれしいです.

于 2013-08-27T21:09:24.890 に答える