2015-04-17 3 views
3

В настоящее время я пытаюсь вызвать JS-скрипт, чтобы экспортировать диаграмму из компонента диаграммы поверхностей. Проблема заключается в том, что переменная base64str, кажется, быть пустым, и ответственный скрипт для заполнения этого значения не вызывается каким-либо причинам:JS-код не выполнен

XHTML код:

<p:chart id="chart" type="line" widgetVar="chart" model="#{cont.lineModel}" style="height:550px;width:1800px"> 
      <p:ajax event="itemSelect" listener="#{cont.itemSelect}" update="growl" />        
    </p:chart> 
    <p:commandButton id="exp" value="Export" icon="ui-icon-extlink" 
      onclick="exportChart();" actionListener="#{cont.submittedBase64Str}" 
      /> 
     <h:inputHidden id="b64" value="#{cont.base64Str}" />      


<script type="text/javascript"> 
     function exportChart() { 
     img = chart.exportAsImage(); 
     document.getElementById('hform:b64').value = img.src; 

     } 
    </script> 

Контроллер:

public void submittedBase64Str(ActionEvent event){ 
// You probably want to have a more comprehensive check here. 
// In this example I only use a simple check 
if(base64Str.split(",").length > 1){ 
    String encoded = base64Str.split(",")[1]; 
    byte[] decoded = org.apache.commons.codec.binary.Base64.decodeBase64(encoded); 
    // Write to a .png file 
    try { 
     RenderedImage renderedImage = ImageIO.read(new ByteArrayInputStream(decoded)); 
     ImageIO.write(renderedImage, "png", new File("D:\\out.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

}

Благодаря

ответ

1

Ch ange ваш onclick атрибут onstart.

<p:commandButton id="exp" value="Export" icon="ui-icon-extlink" 
    onstart="exportChart();" actionListener="#{cont.submittedBase64Str}" /> 

Это должно вызывать функцию JS.

EDIT

Кроме того, необходимо определить img и chart в вашей функции.

+0

Я попробовал, но он все еще не работает ... – Amelie

+0

Просто ради этого вы можете поставить предупреждение() прямо в начале вашей функции? – Alexey

+0

Предупреждение появилось только в начале скрипта. Кажется, что код: img = chart.exportAsImage(); не было выполнено. Затем выполняется actionListener. – Amelie

0

chart объект является виджем PrimeFaces JS. Вы определяете widgetVar:

<p:chart ... widgetVar="chart" 

И тогда вы можете получить объект диаграммы в коде JS, как это:

PF('chart') 

Вы должны использовать функцию PF получить виджеты с момента PrimeFaces 4.0.

Как примечание стороны, это лучше сделать ваш img локальной переменной, а не глобальный:

var img = chart.exportAsImage(); 

Теперь img определяется только в области видимости функции.