Получение резервного значения бина с помощью Javascript

JSF 2.0, Мохарра 2.0.1, PrimeFaces 3.4.1

Есть похожие вопросы, но мне нужно что-то. еще; Функция javascript должна ожидать метода вспомогательного компонента, который заполняет переменную, которую нужно извлечь из функции js. Что я хочу сказать, это:


Предполагая, что функция js просто получает значение и выводит его на экран.

function afterLoad() {    
    alert("#{statusBean.size}");
}

А вот и день рождения малыша:

@ManagedBean
@ViewScoped
public class StatusBean {
    public int size=0;
    List panelList = new ArrayList();
    public void getStatuses() {
        this.panelList = fillList();
        this.size = panelList.size(); //Assuming 3
    }
    //getter and setters
}

Таким образом, функция предупреждает размер как 0, который является его начальным значением, в то время как мыожидаем увидеть 3.

Как это'работает: Если я добавлю@PostConstruct аннотация к бобуКонечно, голова получает правильный размер, потому что bean-компонент уже создан до загрузки страницы. Но это означает избыточные процессы, значение которых просто необходимо после действия командной ссылки. Так как же отложить функцию js? Есть идеи?

 BalusC19 февр. 2013 г., 21:12
Мохарра 2.0.1 древняя. Это'с 3 лет уже. Подумайте об обновлении. В текущей версии 2.1.19 много, много исправлений и улучшений.
 BalusC19 февр. 2013 г., 21:28
Просто выберите тот, который наиболее полезен для вас. Ответы, опубликованные до сих пор, не дают точно такой же информации. Что касается точного времени ответа, просто проверьте всплывающую подсказку "ответил» метка времени. Но вы не должны учитывать это при выборе ответа. Это только имитирует FGITW.
 Ömer Faruk Almalı19 февр. 2013 г., 21:27
@BalusC Хорошо, я собираюсь рассмотреть различия версий, оба ответа верны и работают, спасибо и партлов, но я не смогне решить, какой из них должен быть выбран в качестве ответа. Должен ли я выбрать в связи с первым пришел первым обслужен? Но сервер говорит, что вы ответили 1 минуту назад, но когда я последний раз смотрел, он говорил, что partlov ответил первым. Это одновременно?

Ответы на вопрос(2)

и вы можете обновить ее контейнер (если он находится в каком-либо компоненте JSF), но я бы предложил другой подход.

Когда вы делаете запрос AJAX, вы можете добавить параметр обратного вызова вgetStatuses() метод. Вы можете использовать Primefaces'sRequestContext служебный методaddCallBackParam() за это:

public void getStatuses() {
    this.panelList = fillList();
    this.size = panelList.size();
    RequestContext.getCurrentInstance().addCallBackParam("size", this.size);
}

и вы можете использовать этот параметр в xhtml:

<p:commandlink action="#{statusBean.getStatuses}" oncomplete="afterLoad(xhr, status, args)">

<script type="text/javascript">
  function afterLoad(xhr, status, args) {    
    alert(args.size);
  }
</script>
</p:commandlink>
 Ömer Faruk Almalı19 февр. 2013 г., 21:36
Спасибо за этот великолепный ответ, ты мне сегодня очень помог, мой друг!
 partlov19 февр. 2013 г., 21:37
Добро пожаловать.
 Ömer Faruk Almalı14 апр. 2013 г., 10:41
Привет еще раз, яУ нас есть проблемаaddCallBackParam, Отлично работает при использованииafterLoad(xhr,status,args) при первом вызове Но если я хочу позвонить во второй раз, используя тот жеgetStatuses()в методе afterLoadsize становитсяundefined, Кажется, он не может правильно добавить параметры обратного вызова при втором вызове. Под вторым вызовом я имею в виду следующее: например, пользователь добавляет статус, а после этого успешно работает afterLoad, но если пользователь удаляет статус, ямы определилиremotecommand это вызываетstatusBean.getStatuses и это имеет.oncomplete="afterLoad(xhr,status,args)
Решение Вопроса

не работает синхронно. Вместо этого JSF / EL запускается на веб-сервере и создает HTML / JS, который, в свою очередь, запускается в веб-браузере. Откройте страницу в браузере, щелкните правой кнопкой мыши иПросмотреть исходный код, Вы видите, тамнет ни одной строки JSF / EL. Это'один и все HTML / JS. Вместо функции JS выя увижу:

function afterLoad() {    
    alert("0");
}

Именно эта функция JS вызывается при завершении действия вашей кнопки. Так что результат полностью ожидаемый.

По сути, вы хотите, чтобы JSF повторно отобразил этот фрагмент JS.

<p:commandlink action="#{statusBean.getStatuses}" update="afterLoad" oncomplete="afterLoad()">
<h:panelgroup id="afterLoad">
    <h:outputscript>
        function afterLoad() {    
            alert("#{statusBean.size}");
        }
    </h:outputscript>
</h:panelgroup>
</p:commandlink>

В зависимости от конкретного функционального требования, которое вы не сделалио чем-нибудь рассказывать, могут быть более элегантные способы. Например, ,RequestContext#execute(), так далее.

 hermit30 окт. 2015 г., 10:42
Это старая тема .. Но у меня есть вопрос .. Как это сделать, если я использую внешний файл JavaScript? Пожалуйста, помогите мне.
 Anatoly10 янв. 2015 г., 03:03
BalusC, тыре рок :)

Ваш ответ на вопрос