代码之家  ›  专栏  ›  技术社区  ›  AEgman

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

  •  0
  • AEgman  · 技术社区  · 7 年前

    在Dojo的最新版本中,我遇到了堆叠条形图和柱形图的标签问题。


    示例:从中借用JS fiddle StackExchange post 为了说明这个问题:在“1.10.4”和“夜间”之间更改Dojo版本,您将看到标签位置移动。


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

    我使用的是ESRIs JavaScript API,其中包括Dojo 1.11.1。我曾尝试从旧版本的Dojo复制(和修改)该函数,但似乎其他许多图表函数都发生了变化,我没有成功地使其工作。

    如果失败,是否有办法将旧功能成功地重新安装到新版本?

    谢谢


    编辑:这是我修改的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(这是“isNullValue”)”,我输入了一个错误。

    1 回复  |  直到 7 年前
        1
  •  0
  •   AEgman    7 年前

    使标签正确定位在Dojo StackedBars和StackedColumns图表上的解决方案是创建一个新类,该类继承自dojox/charting/plot2d/StackedBars或dojox/charting/plot2d/stackedColomns,并包含缺少的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。

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

    它可以与ESRI JavaScript API 3.17和3.18一起工作,这正是它的目标。