2013-02-19 2 views
10

JSF 2.0, Mojarra 2.0.1, PrimeFaces 3.4.1Получение резервного значения боба с Javascript

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

<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad()"/> 

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

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

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

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

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

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

+1

Mojarra 2.0.1 древние. Уже более 3 лет. Рассмотрите возможность обновления. В текущей версии 2.1.19 есть много исправлений и исправлений. – BalusC

+0

@BalusC Хорошо, я собираюсь рассмотреть различия в версии, также оба ответа правильны и работают спасибо и partlov, но я не мог решить, какой из них следует выбрать в качестве ответа. Должен ли я выбирать из-за первого поступления? Но сервер говорит, что вы ответили 1 мин назад, но когда я в последний раз смотрел, это говорило, что партов ответил первым. Это одно и то же время? –

+0

Просто выберите тот, который вам наиболее полезен.Ответы, опубликованные до сих пор, не дают точно такой же информации. Что касается точного времени ответа, просто проверьте всплывающую подсказку «ответной» метки времени. Но вы не должны учитывать это при выборе ответа. Это только имитирует FGITW. – BalusC

ответ

17

JSF/EL и HTML/JS не работают синхронно. Вместо этого JSF/EL запускается на веб-сервере и создает HTML/JS, который, в свою очередь, работает в webbrowser. Открыть страницу в браузере, rightclick и View Source. Видите ли, нет единой линии 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> 

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

+0

BalusC, вы рок :) – Anatoly

+2

Это старая тема .. Но у меня вопрос .. Как это сделать, если я использую внешний файл javascript? Пожалуйста, помогите мне. – hermit

8

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

Как вы делаете запрос AJAX, вы можете добавить параметр обратного вызова в метод getStatuses(). Вы можете использовать метод RequestContext утилиты Primefaces в 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> 
+0

Спасибо за этот отличный ответ, ты очень помог мне сегодня, мой друг! –

+0

Добро пожаловать. – partlov

+0

Здравствуйте, еще раз, у меня проблема с 'addCallBackParam'. Он отлично работает при использовании 'afterLoad (xhr, status, args)' при первом вызове. Но если я хочу повторить его во второй раз, используя тот же 'getStatuses()', метод afterLoad 'size' станет' undefined'. Кажется, он не может правильно добавить параметр обратного вызова при втором вызове. То, что я имею в виду со вторым вызовом, - это: например, пользователь добавляет статус, и afterLoad работает после этого успешно, но если пользователь удаляет статус, я определил 'remotecommand', он вызывает' statusBean.getStatuses' и имеет 'oncomplete =" постнагрузки (XHR, статус, арг) '. –

Смежные вопросы