You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dygraph中调用原始numberValueFormatter默认格式化器?

如何在Dygraph中正确调用默认的valueFormatter?

问题描述

我配置了一个带有自定义valueFormatter的Dygraph,希望对"Pass"系列显示自定义文本,其他系列使用官方默认的数字格式化器。目前的实现要么通过内部属性this.attrs_.axes.y.valueFormatter调用,要么用临时方案把原始格式化器存到实例上,想知道官方推荐的调用方式。

原始自定义格式化器代码:

axes: {
    y: {
        valueFormatter: function(val, opts, seriesName, dygraph, row, col) {
            if (seriesName === "Pass") {
                return val > 0 ? "Pass" : "Fail";
            } else {
                var x = this.attrs_.axes.y.valueFormatter(val, opts);
                return x;
            }
        },
    }
},

临时方案代码:

g = new Dygraph(
    document.getElementById("graphdiv"),
    TheDataForDygraph,
    {
        series: {
            Pass: {
                drawPointCallback: Dygraph.Circles.HEXAGON,
                pointSize: 5,
                drawHighlightPointCallback: Dygraph.Circles.STAR,
                highlightCircleSize: 3,
            },
        },
        axes: {
            y: {
                valueFormatter: function(val, opts, seriesName, dygraph, row, col) {
                    if (seriesName === "Pass") {
                        return val > 0 ? "Pass" : "Fail";
                    } else {
                        var x = this.numberValueFormatter(val, opts);
                        return x;
                    }
                },
            }
        },
        labels: TheLabelsForDygraph,
        ylabel: 'Measurements',
    }
);

// 临时方案,暂不知其他获取原始格式化器的方式
g.numberValueFormatter = g.attrs_.axes.y.valueFormatter;

官方推荐的解决方案

方式一:直接调用公开的默认格式化器

Dygraph将默认数字格式化器公开在Dygraph.Utils命名空间下,你可以直接在自定义函数中调用Dygraph.Utils.numberValueFormatter,无需依赖内部未公开属性:

axes: {
    y: {
        valueFormatter: function(val, opts, seriesName, dygraph, row, col) {
            if (seriesName === "Pass") {
                return val > 0 ? "Pass" : "Fail";
            } else {
                // 直接调用官方默认数字格式化器
                return Dygraph.Utils.numberValueFormatter(val, opts);
            }
        },
    }
},

方式二:预存实例默认格式化器(适配全局配置修改场景)

如果你的项目中存在全局修改Dygraph默认配置的情况,需要确保使用当前实例的默认格式化器,可以在创建实例前先获取默认轴配置:

// 获取Dygraph默认的Y轴配置
const defaultYAxisConfig = Dygraph.getDefaultValue('axes', 'y');
// 保存默认的valueFormatter
const defaultYFormatter = defaultYAxisConfig.valueFormatter;

g = new Dygraph(
    document.getElementById("graphdiv"),
    TheDataForDygraph,
    {
        series: {
            Pass: {
                drawPointCallback: Dygraph.Circles.HEXAGON,
                pointSize: 5,
                drawHighlightPointCallback: Dygraph.Circles.STAR,
                highlightCircleSize: 3,
            },
        },
        axes: {
            y: {
                valueFormatter: function(val, opts, seriesName, dygraph, row, col) {
                    if (seriesName === "Pass") {
                        return val > 0 ? "Pass" : "Fail";
                    } else {
                        // 使用预存的实例默认格式化器
                        return defaultYFormatter(val, opts);
                    }
                },
            }
        },
        labels: TheLabelsForDygraph,
        ylabel: 'Measurements',
    }
);

这两种方式都比临时方案更稳定,不会因为Dygraph内部结构变更导致代码失效。

内容的提问来源于stack exchange,提问作者Xan-Kun Clark-Davis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:50:42