私は再利用可能なグラフに選択肢を渡し、d3.select('#id')
の選択肢を渡すと値を返し、d3.selectAll('.class')
の選択肢が渡された場合は値の配列を返します。私は現在、渡された引数をcontext._groups[0] instanceof NodeList
と尋ねていますが、ドキュメント化されていないプロパティを使うと少し壊れているようです。選択肢がselect
またはselectAll
から来るかどうかを判断する方法がありますか?d3.selectかd3.selectAllをチェックする
selection.size()
は、選択の結果だけを示しています。どのように呼び出されたかはわかりません。
EDIT: ここでは、使用のコンテキストを示します。私はMike Bostockのreusable chart patternを使用しています。このインスタンスには、ドーナツのラベルを取得/設定するメソッドが含まれています。
このAPIの使用方法はprinciple of least astonishmentに従っています。結果は返されます。
var donut = APP.rotatingDonut();
// set label for one element
d3.select('#donut1.donut')
.call(donut.label, 'Donut 1')
d3.select('#donut2.donut')
.call(donut.label, 'Donut 2')
// set label for multiple elements
d3.selectAll('.donut.group-1')
.call(donut.label, 'Group 1 Donuts')
// get label for one donut
var donutOneLabel = d3.select('#donut1').call(donut.label)
// donutOnelabel === 'Donut 1'
// get label for multiple donuts
var donutLables = d3.selectAll('.donut').call(donut.label)
// donutLabels === ['Donut 1', 'Donut 2', 'Group 1 Donuts', 'Group 1 Donuts']
と内部メソッドの定義:
App.rotatingDonut = function() {
var label = d3.local();
function donut() {}
donut.label = function(context, value) {
var returnArray;
var isList = context._groups[0] instanceof NodeList;
if (typeof value === 'undefined') {
// getter
returnArray = context.nodes()
.map(function (node) {return label.get(node);});
return isList ? returnArray : returnArray[0];
}
// settter
context.each(function() {label.set(this, value);});
// allows method chaining
return donut;
};
return donut
}
とても面白くて面白い質問です。私はあなたが期待する答えではない答えを書いた。他の誰かが私を間違っていると証明したら、私はそれを喜んで削除します。 –
ちょうど好奇心:*なぜ*あなたはこれをやっていますか?メソッドの型を知らせるだけで、関数に第2引数を渡すのはなぜですか?確かに、これは[XY問題]の強い候補です(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –
私は完全に与えるために私のポストを更新しましたコンテキスト。ここでの目標は、このgetter/setterメソッドを実装する "最もd3のような"方法を見つけることです。 「最良の」答えは、その方法の1つについて同じことをするd3の例です。 –