Plugins 如何制作d3插件?

Plugins 如何制作d3插件?,plugins,d3.js,Plugins,D3.js,我想做一个简单的d3插件,但找不到如何做的信息 它需要非常简单: s.append('text').text("Some Text").editable(); 应该翻译成 s.append('text').text("Some Text").attr('data-editable', true); 我该怎么做呢?不得不通过源代码进行挖掘,但最终得到了它 (function() { d3.selection.prototype.editable = function() { ret

我想做一个简单的d3插件,但找不到如何做的信息

它需要非常简单:

s.append('text').text("Some Text").editable();
应该翻译成

s.append('text').text("Some Text").attr('data-editable', true);

我该怎么做呢?

不得不通过源代码进行挖掘,但最终得到了它

(function() {
  d3.selection.prototype.editable = function() {
    return this.attr('data-editable', true);
  };
})();

另外请注意,如果您还希望在
.enter()
之后应用插件,则需要分配
d3.selection.enter.prototype

如果(如我的情况)您希望您的插件在两种情况下都可用:

(function() {
    d3.selection.prototype.editable = d3.selection.enter.prototype.editable = function() {
        return this.attr('data-editable', true);
      };
})();

我所看到的记录方式如下:

function editable() {
    d3.select(this).attr("data-editable", true);
}
其次是:

s.append('text').text("Some Text").call(editable);


尽管我更喜欢乔治的解决方案。

迈克·博斯托克(Mike Bostock)写了一篇关于可重用图表的文章

我按照这个模式制作了一个非常简单的d3插件示例,请参见以下代码块:(和源代码要点:)

Mike Bostock认为,可重用图表应该实现为“带有getter setter方法的闭包”。我在上面的例子中就是这样做的


@Wex的答案也遵循这种模式,只是它没有证明闭包的想法,因为原始问题没有指定需要任何属性。

Wow,这方面的文档非常缺乏。jQuery把我惯坏了。很好,比我试图破解的要好得多。@Wex-好的一点似乎是在这种情况下,你会想要迭代。@Wex这个老问题,我知道。但答案是“是的”。下面是一个基于OP给出的代码的示例:我认为D3提供了一种“标准”插件方法,这是通过
.call()
实现的。这不像扩展原型那么优雅,但它避免了麻烦@George Mauer指出
d3.selectAll("text").each(editable);