ADF, как вызвать clientListener из бина? - PullRequest
0 голосов
/ 13 декабря 2018

вот что я пытаюсь сделать.

Моя страница ADF встроена в веб-страницу, и я должен установить некоторые значения в родительском окне.

Для этого у меня естьфункция JavaScript, которая прекрасно работает.чтобы получить значение, которое мне нужно выдвинуть, я должен вызвать внешний API с некоторым параметром, который зависит от клика пользователя.

Я реализую вызов в своем компоненте управления, получаю значение и помещаю его вполе ввода на моей странице.

Я также установил clientListener (valueChange) в поле ввода для вызова моей функции javascript.

Теоретически это должно работать просто отлично.

проблема в том, что после того, как пользователь вызвал мое событие serverListener, которое вызывает API, clientListener не вызывается, когда значение помещается в поле ввода.

Я позволил поле видимым для тестированияи я могу сам ввести значение, и оно сработает, но когда бин толкает значение в поле, событие valueChange не получает триггер.

Оттуда возникает вопрос как мне получить событие длятриггер после того, как компонент извлек значение, или как я могу вызвать функцию javascript непосредственно из компонента?

Вот пример кода, который я использую

<af:resource type="javascript">
     function pushValue(evt){
          // push values to parent page
          window.external.main.setFieldValue("fieldName", evt.getSource().getValue());
     }
     function callServerAPI(){
         // call the serverListener
         AdfCustomEvent.queue(it2, "callAPI", {somevalues}, true);
     }
</af:resource>
<af:inputText label="My hidden field" 
              id="it2" 
              binding="#{pageFlowScope.MyAppBean.hiddenField}"
              clientComponent="true">
              <af:clientListener method="pushValue" type="valueChange"/>
              <af:serverListener type="callAPI"
                                method="#{pageFlowScope.MyAppBean.callAPI}"/>
</af:inputText>

Вот образец для боба

private RichInputText hiddenField;
public void callAPI(ClientEvent clientEvent) throws Exception {

    String fieldValue = clientEvent.getParameters().get("somevalues").toString();

    try {

        // call the API and get the value needed in the hidden field
        hiddenField.setValue(fetchValue(fieldValue));

    } catch (Exception e) {
        e.printStackTrace();
    }

    // refresh field
    AdfFacesContext.getCurrentInstance().addPartialTarget(hiddenField);        

}

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 17 декабря 2018

Эта статья https://cedricleruth.com/how-to-execute-client-javascript-in-an-adf-java-bean-action/ ответит на ваш вопрос: "как мне вызвать функцию javascript непосредственно из bean-компонента?" следующим образом:

/*** In YOURJSF.jsf button, or other component that need to execute a javascript on action, add : ****/
<af:commandButton text="ClickMe" id="cb1" actionListener="#{YOURSCOPE.YOURJAVABEAN.clickToExecuteJavascriptAction}"/>

 /*** In YOURJAVABEAN.java class add : ***/
 public void clickToExecuteJavascriptAction(ActionEvent actionEvent) {
  this.executeClientJavascript("console.log('You just clicked : " + actionEvent.getSource() + " ')");
  //Note: if you use a java string value in this function you should escape it to avoid breaking the javascript.
  //Like this : stringValue.replaceAll("[^\\p{L}\\p{Z}]", " ")
 }

//You should put this function in a util java class if you want to use it in multiple bean
public static void executeClientJavascript(String script) {
 FacesContext facesContext = FacesContext.getCurrentInstance();
 ExtendedRenderKitService service = Service.getRenderKitService(facesContext, ExtendedRenderKitService.class);
 service.addScript(facesContext, script);
}
...