2012-01-04 1 views
1
.

. В компоненте штриховки TabView на tabChange. Я хочу сделать ajax-вызов для обновления данных bean-компонента в bean-компоненте, который затем должен обрабатываться javascript (некоторые диаграммы) ,JavaScript извлекает данные до того, как завершился вызов события Primefaces AJAX.

Проблема, которую я испытываю, заключается в том, что данные корректно обновляются с моим вызовом ajax, но javascript, который использует данные, извлекается до того, как он был обновлен с помощью ajax-вызова.

Это компонент firstface с ajax-вызовом события tabChange.

<p:tabView> 
     <p:ajax event="tabChange" listener="#{bean.onTabChange}" /> 
     <p:tab title="Tab 1" id="tab1"> 
       //chart1 
     </p:tab> 

     <p:tab title="Tab 2" id="tab2"> 
       //chart2  
     </p:tab> 

     <p:tab title="Tab 3" id="tab3"> 
       //chart3 
     </p:tab> 
</p:tabView> 

Это JavaScript:

function renderTheChart(tabIndex) { 
    var categories= []; 
    var categories= []; 

    <ui:repeat var="data" value="#{bean.dataList}"> 
     categories[categories.length] = "#{data.id}"; 
     values[values.length] = #{data.value}; 
    </ui:repeat> 


    renderChart(values, categories, tabIndex);   
} 

Чтобы знать, когда для вызова JavaScript, чтобы обновить компонент я попробовал на стороне клиента Обратный звонок.

<p:tabView onTabChange="handleTabChange(event, index)"> 

JavaScript:

function handleTabChange(event, index) { 
    renderTheChart(index); 
} 

ответ

3

Что происходит в том, что onTabChange Javascript выполняется до возникновения постбэк сервера. Это нормальное поведение, и хотя многие компоненты Primefaces имеют атрибут oncomplete, TabView не имеет такого атрибута.

Один из способов, которым вы можете сказать, что Javascript для выполнения при возврате обратной передачи - это добавить javascript в RequestContext. В методе прослушивания действий onTabChange добавление следующего кода добавит скрипт к обратной передаче.

RequestContext context = RequestContext.getCurrentInstance(); 
context.execute("renderTheChart(" + tabIndex + ");"); 

Еще одна проблема, которую вы можете столкнуться, однако, что если вы не указываете элементы в виде обновления из <p:ajax> компонента то <ui:repeat> теги, вероятно, не получите обновилась с новыми значениями для #{bean.dataList}. Вы можете указать, чтобы обновить элементы формы, используя атрибут update компонента ajax, или вы можете добавить его в RequestContext в своем исполнителе действий.

//update panel 
context.addPartialUpdateTarget("form:panel"); 
+0

Все работает хорошо! Спасибо за подсказку с . Это вызывало проблемы, но, как вы упомянули, было решено путем добавления «обновления» в ajax-компоненте! благодаря! – user373455

+0

@ user373455 Без проблем :) Если вы посмотрите на г-наОтвет на J4mes ниже, он также должен решить проблему с Javascript, и это, по-моему, более чистое решение, поскольку для этого не требуется никакого дополнительного кода Java. –

3

Если вы укажете функции JavaScript в атрибуте onTabChange из <p:tabView> компонента, он будет срабатывать до события, указанного в <p:ajax> компонента. В результате ваша функция JavaScript получит старые данные с сервера, прежде чем будет обновлена.

Компонент PrimeFaces <p:ajax> имеет один атрибут, который является oncomplete, и это именно то место, где вы должны установить JavaScript. Было бы так:

<p:ajax event="tabChange" listener="#{bean.onTabChange}" 
     oncomplete="handleTabChange(event, index);" update="someIDs"/> 

Ваша функция JavaScript теперь будет стрелять только когда ваш bean.onTabChange функция возвращает. Кроме того, не забудьте повторно отобразить любые части страницы, которые должны отображать новые данные с атрибутом update<p:ajax>.

+0

Это лучший ответ. Я забыл о '', уже имеющем атрибут 'oncomplete'. –

+0

@maple_shaft: thanks :) –

+0

Я не видел этого обновления, пока не попробовал кленовое решение, и оно сработало. Это, однако, выглядит так, как говорит клен, опрятный. Я пробовал, но я получаю сообщение об ошибке «index not defined». Однако он работает для отправки только «события». Можно ли получить индекс (или идентификатор табуляции?) Из объекта события? – user373455