Javascript 可变闭环(通过插件选项)

Javascript variable closure loop (through plugin option)

所以我得到了 jquery 图表,它使用刻度格式化程序来正确显示我的值。

图表可以有多个轴,为了正确生成它们,我使用了一个包含我的格式化程序函数的循环。

for (var i = 0; i < axis.xaxis.length; i++) {
    var format = format || "HH:mm";

    var tickFormatter = function(val, axis) {
        return ValueToTime(Math.abs(val), format, true);
    };

    myAxes.xaxis.push({
        tickFormatter: tickFormatter,
        tickSize: tickSize,
        position: thisPos || "left"
    });
}

执行格式化程序时 formatundefined 因此我所有的标签也显示为“undefined”。

是否可以将我的变量传递给函数?

请注意:该函数是在插件内部调用的,我不希望对其进行编辑,因为它是开源的。

使用另一个函数来创建不同的刻度格式器,这样您就可以在每个格式字符串上得到一个闭包:

function getTickFormatter(format) {
    return function(val, axis) {
        return ValueToTime(Math.abs(val), format, true);
    };
}

for (var i = 0; i < axis.xaxis.length; i++) {
    var format = format || "HH:mm";

    var tickFormatter = getTickFormatter(format);

    myAxes.xaxis.push({
        tickFormatter: tickFormatter,
        tickSize: tickSize,
        position: thisPos || "left"
    });
}

有关闭包的更多信息,请参阅以下问题:

  • JavaScript closure inside loops – simple practical example
  • How do JavaScript closures work?

所以似乎唯一建议的答案不太奏效...

然而,有效的是通过插件的选项传递我的格式变量。

for (var i = 0; i < axis.xaxis.length; i++) {
    var format = format || "HH:mm";

    var tickFormatter = function (val, axis) {
        return ValueToTime(Math.abs(val), axis.options.format, true);
    };

    myAxes.xaxis.push({
        tickFormatter: tickFormatter,
        tickSize: tickSize,
        format: format,
        position: thisPos || "left"
    });
}

我知道 flot 有一个 'time' 格式,但它的功能非常有限,尤其是当我的客户对细节非常挑剔的时候。