将D3.js与模块模式一起使用

时间:2014-04-23 17:59:19

标签: javascript d3.js module-pattern

d3调用回调函数时,this似乎设置为窗口。

我如何设置模块级变量,例如,JSON响应回调?

在下面的示例中,MODULE.Submodule.bar已设置,但MODULE.Submodule.foo不是

var MODULE = MODULE || {};

MODULE.Submodule = (function(){
    var foo = [],
        bar = [];

    var init = function() {
        d3.json('path_to_file.json', set_globals);
    }

    var set_globals = function(error, json) {
        this.foo = ['a','b','c']; // 'this' doesn't point to MODULE.Submodule 
        bar.push('a');
        console.log('foo: ' + MODULE.Submodule.foo); // foo:
        console.log('bar: ' + MODULE.Submodule.bar); // bar: a
    }

    return {
        init: init,
        foo: foo,
        bar: bar
    }
}());

MODULE.Submodule.init();

我考虑过透露set_globals,然后将d3.json的回调转换为this.set_globals,但这并不重要。

我还尝试过在this之前删除this.foo = ['a','b','c'];,但情况也不差。

1 个答案:

答案 0 :(得分:0)

这样就可以了。如果需要,它可以通过使用扩充动态创建父MODULE来设置清理工作。

var MODULE = (function (module) {
    var sub = module.Submodule = module.Submodule || {
        foo: [],
        bar: [],
        init: function () {
            d3.json('path_to_file.json', set_globals);
        }
    };

    function set_globals(err, json) {
        sub.foo = ['a', 'b', 'c'];
        sub.bar.push('a');
    }

    return module;
}(MODULE || {}));

然后只需像以前一样调用MODULE.Submodule.init()