Nano Hash - криптовалюты, майнинг, программирование

Получить возвращаемое значение из управляемого компонента в javascript

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

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

Это p:remoteCommand :

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

Этот p:remoteCommand вызовет метод управляемого компонента 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();
});

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


Ответы:


1

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);
}

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

$('selector').on('click', function (e) {
    checkPageLayoutsAreSelected();
    window.getLayoutAreSelectedResult= function(xhr, status, args) {
       var returnedValue = args.returnedValue;
       console.log(returnedValue);
    }
});
22.02.2017
  • Спасибо, но я знаю об этом подходе, который не работает в моем случае, поэтому я хочу получить returnedValue внутри функции события, потому что в этом случае мне придется создать глобальную переменную в моем Javascript код, а затем, когда будет вызван getLayoutAreSelectedResult, я назначу returnedValue этой глобальной переменной, которая не будет работать, поскольку getLayoutAreSelectedResult будет выполняться после завершения функции события, поэтому я не смогу увидеть returnedValue до события click запускается снова, что является старым returnedValue для события первого клика 23.02.2017

  • 2

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

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

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

    вид.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 запускается достаточно быстро.

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

    23.02.2017
  • Спасибо, но когда я пытался сделать что-то вроде этого: checkPageLayoutsAreSelected(); console.log($('#remote\\:checkPageLayoutValueId').val()); я всегда получаю старое значение до изменения dom, поскольку $('#remote\\:checkPageLayoutValueId').val() выполняется до 23.02.2017
  • Это должно быть выполнено «после/во время завершения» удаленной команды, вы не можете использовать onsuccess или pre, или, конечно, вам нужно повторно запустить свой javascript после того, как выполнение произошло, все еще есть dom во время рендеринга. . 24.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..