0

クエリが実行されたときに開かれたポップアップがあります。クエリを処理してからポップアップを開く Bean がありました。

問題は、ページを .jsf から .jsff(Fragments) に変更したところ、機能しなくなったことです。

誰でもこの問題を解決する方法を説明できますか?

これは私のBeanクラスです:

package view;

import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.MethodExpression;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import javax.faces.event.ComponentSystemEvent;

import oracle.adf.view.rich.component.rich.RichPopup;
import oracle.adf.view.rich.event.QueryEvent;

import org.apache.myfaces.trinidad.render.ExtendedRenderKitService;
import org.apache.myfaces.trinidad.util.Service;

public class newBean {

    public newBean() {
        super();
    }

    public void processSomeQuery(QueryEvent queryEvent) {   

     /** Manipulate ViewCriteria, if you want and 
      *  then invoke query,optionally 
      */   
     System.out.println("INNNNNNNNNNNNNNNNN");   
         invokeQueryEventMethodExpression("#{bindings.ImplicitViewCriteriaQuery.processQuery}",   
            queryEvent);   

     openPopup("p1");
     }   
     /**
      * Gets ViewCriteria used by the QueryModel
      */     

     private void invokeQueryEventMethodExpression(String expression,   
                  QueryEvent queryEvent) {   

     FacesContext fctx = FacesContext.getCurrentInstance();   
     ELContext elctx = fctx.getELContext();   
     ExpressionFactory efactory =   
      fctx.getApplication().getExpressionFactory();   
     MethodExpression me =   
      efactory.createMethodExpression(elctx, expression, Object.class,   
                new Class[] { QueryEvent.class });   
     me.invoke(elctx, new Object[] { queryEvent });  
     } 

    public void openPopup (String popupId) {
        ExtendedRenderKitService erkService =
        Service.getService(FacesContext.getCurrentInstance().getRenderKit(),
        ExtendedRenderKitService.class);
        erkService.addScript(FacesContext.getCurrentInstance(),
        "var hints = {autodismissNever:true}; " +
        "AdfPage.PAGE.findComponent('" + popupId +
        "').show(hints);");
        System.out.println("POPUP INNNNN");
    }

    public void closePopup (String popupId) {
        ExtendedRenderKitService erkService =
        Service.getService(FacesContext.getCurrentInstance().getRenderKit(),
        ExtendedRenderKitService.class);
        erkService.addScript(FacesContext.getCurrentInstance(),
        "var hints = {autodismissNever:true}; " +
        "AdfPage.PAGE.findComponent('" + popupId +
        "').hide(hints);");
    }

}

これは、クエリの結果を表示するテーブルを内部に持つポップアップ コードです。

<af:panelGroupLayout layout="vertical" id="pgl2">
                    <af:popup childCreation="deferred" autoCancel="disabled" id="p1" contentDelivery="lazyUncached">
                        <af:panelWindow id="pw1">
                            <af:panelCollection id="pc1">
                                <f:facet name="menus"/>
                                <f:facet name="toolbar"/>
                                <f:facet name="statusbar"/>
                                <af:table value="#{bindings.NameView1_1.collectionModel}" var="row"
                                          rows="#{bindings.NameView1_1.rangeSize}"
                                          emptyText="#{bindings.NameView1_1.viewable ? 'No data to display.' : 'Access Denied.'}"
                                          rowBandingInterval="0"
                                          selectedRowKeys="#{bindings.NameView1_1.collectionModel.selectedRow}"
                                          selectionListener="#{bindings.NameView1_1.collectionModel.makeCurrent}"
                                          rowSelection="single" fetchSize="#{bindings.NameView1_1.rangeSize}"
                                          id="resId1">
                                    <af:column headerText="#{bindings.NameView1_1.hints.IdNo.label}" id="resId1c1">
                                        <af:outputText value="#{row.IdNo}"
                                                       shortDesc="#{bindings.NameView1_1.hints.IdNo.tooltip}" id="ot1">
                                            <af:convertNumber groupingUsed="false"
                                                              pattern="#{bindings.NameView1_1.hints.IdNo.format}"/>
                                        </af:outputText>
                                    </af:column>
                                    <af:column headerText="#{bindings.NameView1_1.hints.Title.label}" id="resId1c2">
                                        <af:outputText value="#{row.Title}"
                                                       shortDesc="#{bindings.NameView1_1.hints.Title.tooltip}"
                                                       id="ot2"/>
                                    </af:column>
                                    <af:column headerText="#{bindings.NameView1_1.hints.Name.label}" id="resId1c3">
                                        <af:outputText value="#{row.Name}"
                                                       shortDesc="#{bindings.NameView1_1.hints.Name.tooltip}" id="ot3"/>
                                    </af:column>
                                    <af:column headerText="#{bindings.NameView1_1.hints.Rowid1.label}" id="resId1c28">
                                        <af:outputText value="#{row.Rowid1}"
                                                       shortDesc="#{bindings.NameView1_1.hints.Rowid1.tooltip}"
                                                       id="ot28"/>
                                    </af:column>
                                </af:table>
                            </af:panelCollection>
                        </af:panelWindow>
                    </af:popup>

PS:テーブルの値の一部をここに投稿するために削除したテーブルの非常に広範なコードを持たないようにするために、間違いを犯さなかったことを願っています。

また、クエリで QueryListner を次のように定義しました: #{managedBean1.processSomeQuery}

本当にありがとうございます。よろしくお願いします

4

1 に答える 1

2

PopupId を直接使用しないでください。newBean クラスでポップアップのバインディングを作成し、このバインディングとメソッド getClientId(); を使用してください。

たとえば、newBean を変更し、クラスの先頭に次を追加します。

private RichPopup myPopup=new RichPopup();
public RichPopup getMyPopup(){ return this.myPopup; }
public void setMyPopup(RichPopup myPopup) { this.myPopup = myPopup; }

次に、openPopup 関数内のコードを次のように変更します。

        erkService.addScript(FacesContext.getCurrentInstance(),
    "var hints = {autodismissNever:true}; " +
    "AdfPage.PAGE.findComponent('" + popupId +
    "').show(hints);");
    System.out.println("POPUP INNNNN");

に置き換わる

    myPopup.show(hints);
    System.out.println("POPUP INNNNN");

次のように、jsff 内でポップアップをバインドすることを忘れないでください。

<af:popup childCreation="deferred" autoCancel="disabled" id="p1" contentDelivery="lazyUncached" bindings="#{pageFlowScope.newBean.myPopup}">
于 2013-10-22T10:39:43.297 に答える