2

我想在我的 Apex 应用程序上有一个 100% 可自定义的图表。为此,我想添加一个带有 Java 脚本的 Anychart 并使用自定义 xml。

我将 OracleAnyChart.swf 和 Preloader.swf 文件添加到 Shared Components -> Static Application Files。

我在“页面加载时执行”下有这段代码

AnyChart.renderingType = anychart.RenderingType.SVG_PREFERRED;   
var chart = new AnyChart('#APP_IMAGES#OracleAnyChart.swf','#APP_IMAGES#Preloader.swf', 'be_chart');
chart.width = 600;
chart.height = 150; 
chart.messages = {
loadingConfig: "Loading config...",
waitingForData: "Waiting for data..."}
console.log('ID = ' || chart.id);

var jqxhr =  apex.server.process( 'GET_BEXML',
                                { 
                                    pageItems: "#BE_DATA"
                                },
                                {
                                    dataType : 'text'
                                }
                                );  
jqxhr.done(function(pData) {
                       console.log(chart.id);
                       chart.setData($v('BE_DATA'));
                       chart.write('container_be');  
                       //chart.refresh(); 
    }         
    );

我的按需流程“GET_BEXML”使用正确的 XML 设置项目 BE_DATA,但图表未呈现。

图表未正确呈现

我试着打电话

var chart = getChartById('be_chart');
chart.setData($v('BE_DATA'));
chart.refresh();

来自动态操作,但似乎我无法在动态操作的范围内调用任何anychart 函数,它显示“getCharById 它未定义”。

我错过了什么吗?

4

1 回答 1

0

您正在调用一个不存在的方法。您需要像这样引用 AnyChart 对象(并且可能更改变量名称,以免覆盖原始图表对象):

var mychart = AnyChart.getChartById('be_chart');

实际上...
我回复了您调用 getChartById 失败的原因。
我意识到这不是真正的问题。


您是否尝试过将数据直接传递给 done() 回调函数?
这种方法有效。真正伟大的是,您可以返回的数据没有 32K 限制

-- Apex Application Process "GET_BEXML"
declare
    v_limit constant pls_integer := 32767;
    v_buff  varchar2(32767);
    v_data  clob;
    v_os    pls_integer := 1;
    v_len   pls_integer := 0;
begin
    v_data := get_anydata_xml_doc;  -- a PL/SQL function returning your AnyData xml
    v_len  := dbms_lob.getlength(v_data);
    while v_os < v_len
    loop
        dbms_lob.read(v_data, v_limit, v_os, v_buff);
        htp.prn(v_buff);
        v_os := v_os + v_limit;
    end loop;
end;

// "Execute when Page Loads"
    var jqxhr = apex.server.process('GET_BEXML', {}, {dataType:'text'});
    jqxhr.done(function(pData) {
        console.log(pData.substring(1,50));
        chart.setData(pData);
        chart.write('container_be');
    });

当然,您也可以在 Apex 中动态创建 AnyData xml clob。

于 2017-07-21T02:47:44.403 回答