Dojo堆积条形图/柱形图标签位置不正确

时间:2016-11-17 10:40:26

标签: javascript esri dojox.charting

我遇到了最新版Dojo中堆积条形图和柱形图标签的问题。 当标签从0开始绘制时,标签被放置在条/列的中心,而不是从前一个条/列的末端开始。这意味着标签经常在条/列的中间重叠,或出现在条/列的错误部分。

示例:借用此StackExchange post中的JS小提示来说明问题:在“1.10.4”和“nightly”之间更改Dojo版本,您将看到标签位置移动。

我找到了问题的原因,“GetValue”函数已从版本1.10.6和1.11.1之间的StackedBars和StackedColumn(Dojox \ charting \ plot2d \ StackedColumn.js)文件中删除。此函数使用前一个条形/列值来调整标签位置,因为它现在不会发生这种情况。

我正在使用ESRIs JavaScript API,其中包括Dojo 1.11.1。我已经尝试从旧版本的dojo中复制(和修改)该函数,但是看起来很多其他图表函数已经改变了,而且我还没有成功地使它工作。

我仍然是JavaScript和Dojo的新手,但无论如何都要重新添加此函数而不修改ESRI API中的文件?

如果没有办法将旧功能成功改装到新版本?

谢谢!

编辑:这是我修改过的StackedBars.js的内容:

//>>built
define("dojox/charting/plot2d/StackedBars",["dojo/_base/declare","dojo/_base/lang","./Bars","./commonStacked"],function(c,e,f,d){
    return c("dojox.charting.plot2d.StackedBars",f,{
    getSeriesStats:function(){
        var a=d.collectStats(this.series,e.hitch(this,"isNullValue")),b;
        a.hmin-=0.5;
        a.hmax+=0.5;
        b=a.hmin;
        a.hmin=a.vmin;
        a.vmin=b;
        b=a.hmax;
        a.hmax=a.vmax;
        a.vmax=b;
        return a
    },
    rearrangeValues:function(a,b,c){
        return d.rearrangeValues.call(this,a,b,c)
    },
    // COPIED THIS FUNCTION FROM 1.10.6
    getValue:function(_5,_6,_7,_8){
        var y,x;
        if(_8){
            x=_6;
            y=d.getIndexValue(this.series,_7,x,e.hitch(this, "isNullValue"));
        }
        else{
            x=_5.x-1;
            y=d.getValue(this.series,_7,_5.x);
            y=[y[0]?y[0].y:null,y[1]?y[1]:null];
        }
        return {x:x,y:y[0],py:y[1]};
    }
})});

我最初的问题是“e.hitch(this,”isNullValue“)”,我写错了。

我仍然有一个问题,这对于具有负值的图表没有用(没有错误,只是错误位置的标签),以及如何在不修改Dojo源文件的情况下应用此函数?

1 个答案:

答案 0 :(得分:0)

在Dojo StackedBars和StackedColumns图表上正确定位标签的解决方案是创建一个继承自dojox / charting / plot2d / StackedBars或dojox / charting / plot2d / StackedColumns的新类,并包含缺少的GetValue函数。

这是StackedBars的工作类:

define(["dojo/_base/declare", "dojox/charting/plot2d/StackedBars", "dojox/charting/plot2d/commonStacked", "dojo/_base/lang"], 
function(declare, StackedBars, commonStacked, lang){

return declare("FixedStackedBars", dojox.charting.plot2d.StackedBars, {
    getValue: function(value, index, seriesIndex, indexed){
        var y,x;
        if(indexed){
            x = index;
            y = commonStacked.getIndexValue(this.series, seriesIndex, x, lang.hitch( this, "isNullValue" ) );
        }else{
            x = value.x - 1;
            y = commonStacked.getValue(this.series, seriesIndex, value.x);
            y = [  y[0]?y[0].y:null, y[1]?y[1]:null ];
        }
        // in py we return the previous stack value as we need it to position labels on columns
        return { x: x, y: y[0], py: y[1] };
    }
});
});

在代码中使用此新类代替dojox / charting / plot2d / StackedBars。

然而,这种方法并不完美,因为它不会考虑可能已经在StackedBar / StackedColumn类中包含GetValue函数的旧版或未来版本的Dojo。需要一些检查基类是否包含GetValue方法的机制。

它适用于ESRI JavaScript API 3.17和3.18。