我在使用 Dojo 的图形库时有一个蜘蛛图,定义如下:

require([
    "dojox/charting/Chart",
    "dojox/charting/themes/Claro",
    "dojox/charting/plot2d/Spider",
    "dojox/charting/action2d/Tooltip",
    "dojox/charting/widget/SelectableLegend",
    "dojox/charting/axis2d/Default"
    ], function (Chart, theme, Spider, Tooltip, Legend, Default) {
        var chart = new Chart(element).setTheme(theme).addPlot("default", {
            type: Spider,
            radius: 200,
            fontColor: "black",
            labelOffset: "-20"
        });
        var colors = ["blue", "red", "green", "yellow", "purple", "orange", "teal",
                    "maroon", "olive", "lime", "aqua", "fuchsia"];
        $.each(factors, function (index, factor) {
            chart.addAxis(factor.name, {
                 type: Default,
                 min: factor.min,
                 max: factor.max
             });
        });
        $.each(presets, function (pIndex, preset) {
            var data = [];
            $.each(factors, function (fIndex, factor) {
                 data[factor.name] = preset.values[fIndex];
            });
            chart.addSeries(preset.short, data, {
                 fill: colors[pIndex % colors.length]
            });
        });
        new Tooltip(chart, "default");
        chart.render();
        new Legend({
            chart: chart,
            horizontal: false
        }, $(element).next(".legend")[0]);
    });

我为名为 presets 的数组的每个成员添加了一个系列,并使用了一个可选择的图例,让用户可以根据需要打开或关闭它们。但是,我在文档中似乎找不到的是如何在未选择、不可见的状态下开始一个系列?理想情况下,我想要做的是限制页面加载时可见的系列数量,因为在某些情况下,我有多达 14 个预设,在用户取消选择之前它看起来很困惑。所以我想在开始时隐藏前 5 个以上的每个预设。

这是我用来演示的一个粗略的 fiddle。我想要的是在首次显示绘图时取消选择某些系列。

更新 :我在添加我的系列后尝试添加它:
var checkboxes = $(".dijitCheckBoxInput").each((index, elem) => {
     if (index > 4) {
         elem.click();
     }
});

哪个有效,但似乎非常脆弱。如果他们更改分配给复选框的类,它将中断。此外,它禁止我使用多于一组的道场复选框,因为我没有很好的方法来区分它们。 (注意,由 SelectableLegend 添加的复选框的 ID 是 dijit_form_CheckBox_0dijit_form_CheckBox_1 等,它们也没有提供关于它们相关的有用信息)。我以为我可以使用图例占位符 div 作为选择后代复选框的一种方式,但似乎 Dojo 完全用表格替换了占位符。

最佳答案

我查看了 dojo 代码,找到了在 SelectableLegend.js 中打开和关闭形状的区域:



切换过程非常复杂,并且基于许多本地属性:

_toggle: function(shapes, index, isOff, dyn, seriesName, plotName){
            arrayUtil.forEach(shapes, function(shape, i){
                var startFill = dyn.fills[i],
                    endFill = this._getTransitionFill(plotName),
                    startStroke = dyn.strokes[i],
                    endStroke = this.transitionStroke;
                if(startFill){
                    if(endFill && (typeof startFill == "string" || startFill instanceof Color)){
                        fx.animateFill({
                            shape: shape,
                            color: {
                                start: isOff ? endFill : startFill,
                                end: isOff ? startFill : endFill
                            }
                        }).play();
                    }else{
                        shape.setFill(isOff ? startFill : endFill);
                    }
                }
                if(startStroke && !this.outline){
                    shape.setStroke(isOff ? startStroke : endStroke);
                }
            }, this);
        }

我还尝试手动检查和取消选中图例中的 dijit/form/Checkbox,但这在任何情况下都不会触发 _toggle 函数,即使您在图表上执行 render()/fullrender() 也是如此。

考虑到这一点,似乎除了手动触发 onclick 事件之外,似乎没有其他方法可以打开和关闭系列。

为了使您的代码不那么脆弱,您可以使用以下方法手动访问图例中的 Checkbox 小部件:



并在它们上触发 onclick 事件。它们在数组中的键号应对应于添加的系列的顺序...

Dojo 是一件很好的作品,请不要停止使用它!

关于dojo - 默认情况下在蜘蛛图中隐藏一个系列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14739176/

10-14 06:50