2017-02-17 24 views
4

В моем приложении я вызываю событие Javascript, который называет p:remoteCommand имени checkPageLayoutsAreSelected следующим образом:Получить возвращаемое значение из управляемого компонента в JavaScript

$('selector').on('click', function (e) { 
    checkPageLayoutsAreSelected(); 
}); 

Это p:remoteCommand:

<p:remoteCommand name="checkPageLayoutsAreSelected" actionListener="#{beanFormDashboard.checkPageLayoutsAreSelected}" /> 

Это p:remoteCommand вызовет метод в управляемом bean-компоненте beanFormDashboard, который вернет логическое значение:

public Boolean checkPageLayoutsAreSelected(){ 
    for(DashboardPage dp : dashboardPageList){ 
     if(dp.getModel() == 0){ 
      return false; 
     } 
    } 
    return true; 
} 

Так что я хочу получить возвращаемое значение checkPageLayoutsAreSelected() из управляемого компонента в коде Javascript.

Что-то вроде этого:

$('selector').on('click', function (e) { 
    var returnedValue = checkPageLayoutsAreSelected(); 
}); 

Как я могу это сделать?

ответ

3

checkPageLayoutsAreSelected не возвращает значение или даже обещание, но вы можете вернуть значение Ajaxicaly.

<p:remoteCommand name="checkPageLayoutsAreSelected" 
    action="#{beanFormDashboard.checkPageLayoutsAreSelected()}" 
    oncomplete="getLayoutAreSelectedResult(xhr, status, args);" 
/> 

И в методе checkPageLayoutsAreSelected() вы используете RequestContext предоставленный PF отправить результат обратно к клиенту:

public void checkPageLayoutsAreSelected() { 
    Boolean result=true; 
    for(DashboardPage dp : dashboardPageList){ 
     if(dp.getModel() == 0){ 
      result= false; 
     } 
    } 
    RequestContext reqCtx = RequestContext.getCurrentInstance();   
    reqCtx.addCallbackParam("returnedValue", result); 
} 

И в функции getLayoutAreSelectedResult(xhr, status, args) обратного вызова Javascript вы будете иметь возвращаемое значение:

$('selector').on('click', function (e) { 
    checkPageLayoutsAreSelected(); 
    window.getLayoutAreSelectedResult= function(xhr, status, args) { 
     var returnedValue = args.returnedValue; 
     console.log(returnedValue); 
    } 
}); 
+0

Спасибо, но я знаю об этом подходе, который не работает в моем случае, поэтому я хочу получить 'returnValue' внутри функции события, потому что в этом случае мне нужно будет создать глобальный var в моем Javascript-коде, а затем, когда getLayoutAreSelectedResult будет вызван, я назначу 'returnValue' этому глобальному var, который не будет работать, поскольку' getLayoutAreSelectedResult' будет выполнен после завершения функции события, поэтому я не буду способный видеть 'returnValue' до тех пор, пока событие click не будет запущено снова, это старый' returnValue' для первого события click –

+0

Hi @AimadMAJDOU, я отредактировал мой ответ, лучше ли это? – fingerpich

+0

это сработало, спасибо. –

0

Другой ответ работает и дает вам полный доступ к xhr, но вы теоретически могли бы это сделать в любой момент времени, бросить что-то в requestS справиться и переделать, затем вытащить его из EL. Лично я предпочитаю видеть элементы на странице, так как мы можем использовать их позже для любой информации, но это другой способ сделать это. Установите скрытый элемент со ссылкой на данные вашего компонента и заверните его в компонент, который может быть нацелен на повторный рендеринг.

Затем в вашем checkPageLayoursAreSelected установите значение этого объекта в bean-компоненте и удалитеCommand визуализируйте/обновите оболочку компонента вашего элемента, а затем эффект after просто используйте базовые JS или Jquery, чтобы получить значение из доминион

Рабочий пример:

View.xhtml

<button type="button" id="buttonClicker" class="buttonClicker" >Click Me</button> 

    <p:remoteCommand name="checkPageLayoutsAreSelected" actionListener="#{testBean.checkPageLayoutsAreSelected}" update="pageLayoutSelected" oncomplete="showVal()"/> 

    <h:panelGroup id="pageLayoutSelected"> 
     <h:inputHidden value="#{testBean.pageLayoutSelected}" id="checkPageLayoutValueId" /> 
    </h:panelGroup> 

    <script> 
    $('.buttonClicker').on('click', function (e) { 
     checkPageLayoutsAreSelected(); 
    }); 
    function showVal() { 
     alert($("[id$='checkPageLayoutValueId']").val()); 
    }; 
    </script> 

TestBean.java

private Boolean pageLayoutSelected; 

    public Boolean checkPageLayoutsAreSelected(ActionEvent event) { 
     if (pageLayoutSelected == null || pageLayoutSelected == Boolean.FALSE) { 
      pageLayoutSelected = Boolean.TRUE; 
     } else { 
      pageLayoutSelected = Boolean.FALSE; 
     } 

    return pageLayoutSelected; 
} 
getters/setters 

Я добавил предупреждение, чтобы показать вам, что = данные были изменены.

Важно, что вам нужно скорее всего это сделать в неполной фазе - так как абсолютно уверен, что рендеринг dom был опущен, при условии, что DOM может по-прежнему иметь более старое значение, если JS работает достаточно быстро.

Надеюсь, это поможет.

+0

Спасибо, но когда я попытался сделать что-то вроде этого: 'checkPageLayoutsAreSelected();' 'console.log ($ ('# remote \\: checkPageLayoutValueId'). Val());' Я всегда получаю старое значение перед dom изменяется как '$ ('# remote \\: checkPageLayoutValueId'). val()' выполняется до –

+0

Он должен быть активирован «после/в неполном» remotecommand, вы не можете использовать onsuccess или pre , или, конечно же, вам нужно повторно запустить свой javascript после того, как это произошло, все еще существует функция во временном рендеринге ... – VeenarM