0

我尝试通过 Java + rhino + evjs + d3 呈现 svg。一切都很好地使用线性秤。仅在时间尺度上,我遇到了我无法解决的问题。

请检查这段 javascript:

function Scale_timed(f,domain,range){
    var obj = this;
    this.field = f;

    // print (DATA.jsGetDomain(domain)[0] + "/" + DATA.jsGetDomain(domain)[1]);
    // print (range[0] + "/" + range[1]);
    this.scale = d3
        .time.scale()
        .range(range)
        .domain(DATA.jsGetDomain(domain));

    this.get = function(i) {
        print("lala: " + DATA.jsGetPrimitive(obj.field,i) + " - " + (DATA.jsGetPrimitive(obj.field,i).getDate()) + " - " + obj.scale(DATA.jsGetPrimitive(obj.field,i)));
        return obj.scale(DATA.jsGetPrimitive(obj.field,i));
    };
}

其中 DATA 是 rhino 脚本范围内的 Java 对象。输出清楚地显示缩放函数输入参数是一个日期,但我仍然从我的缩放函数中得到一个 NaN。

输出:

lala: Tue Jan 04 00:00:00 CET 2011 - 4 - NaN
lala: Wed Jan 05 00:00:00 CET 2011 - 5 - NaN
lala: Thu Jan 06 00:00:00 CET 2011 - 6 - NaN
lala: Fri Jan 07 00:00:00 CET 2011 - 7 - NaN
lala: Mon Jan 10 00:00:00 CET 2011 - 10 - NaN

我认为问题出在 d3 规模使用的某个地方......所以我只会用 d3 标签来问这个问题。

编辑:这会很好用:

function Scale_timed(f,dom,range){
    var obj = this;
    this.field = f;

    // print (DATA.jsGetDomain(domain)[0].getDate() + "/" + DATA.jsGetDomain(domain)[1].getDate());
    // print ("range: "+ range[0] + "/" + range[1]);
    this.scale = d3
        .scale.linear() //.time.scale()
        .range(range)
        .domain([DATA.jsGetDomain(dom)[0].getTime(), DATA.jsGetDomain(dom)[1].getTime()])
        //.domain(DATA.jsGetDomain(dom))
        .nice();

    this.get = function(i) {
        print("time: " + DATA.jsGetPrimitive(obj.field,i) + " - " + (DATA.jsGetPrimitive(obj.field,i).getDate()) + " - " + obj.scale(DATA.jsGetPrimitive(obj.field,i).getTime()));
        return obj.scale(DATA.jsGetPrimitive(obj.field,i));
    };
}

现在我认为这是一个犀牛问题,可能缺少 Date.protype 函数......

4

1 回答 1

0

实际上这是一个 Rhino 问题,rhino 使用 java.util.Date 作为日期而不是 ECMA 日期,所以你必须自己转换它.. wtf .. 但这会起作用:

function Scale_timed(f,dom,range){
    var obj = this;
    var domain = DATA.jsGetDomain(dom);
    for (var i=0;i<domain.length;i++) domain[i] = new Date(domain[i].getTime());

    this.field = f;

    this.scale = d3
        .time.scale()
        .range(range)
        .domain(domain)
        ;

    this.get = function(i) {
        // print("time: " + DATA.jsGetPrimitive(obj.field,i) + " - " + (DATA.jsGetPrimitive(obj.field,i).getDate()) + " - " + obj.scale(DATA.jsGetPrimitive(obj.field,i).getTime()));
        print("time: " + DATA.jsGetPrimitive(obj.field,i) + " - " + (DATA.jsGetPrimitive(obj.field,i).getDate()) + " - " + obj.scale(new Date(DATA.jsGetPrimitive(obj.field,i).getTime())));
        return obj.scale(new Date(DATA.jsGetPrimitive(obj.field,i).getTime()));
    };
}
于 2013-08-20T10:12:44.433 回答