2017-01-28 8 views
0

にアクセスし、私は次の関数の出力にアクセスする方法を理解するトラブルを抱えている:私は理解してやっていることは、それは次のように渡されたときということですD3.js:JavaScriptで初心者としての機能の出力

function dimensionLabels(d) { 
    return __.dimensions[d].title ? __.dimensions[d].title : d; // dimension display names 
} 

.textセクションでコールバック関数は、それが正常にブラウザに表示されるいくつかのテキストを返します(例:「ヘッダを[N°1]」):

.append("svg:text") 
     .attr("text-anchor", "middle") 
     .attr('x', 0) 
     .attr('y', -10) 
     .attr('class', "label") 

     .append('svg:tspan') 
     .attr('x', 0) 
     .attr('dy', 0) 
     .text(dimensionLabels) 

だから私は仮定していdimensionLabels

は私が交換するかのように、いくつかの文字列を返します。 text(dimensionLabels).text( "myString")で、元のテキスト( "Header [n°1]")は正常にr "myString"と置き換えられます。

しかし、私がしなければならないことは、dimensionLabelsからテキストにアクセスし、それを処理することです。使用:

.text(dimensionLabels.split('[', 2)) 

しかし、これは次のエラーを生成します。

TypeError: dimensionLabels.split is not a function

誰かが親切作品の上にどのように機能を記述することができる、と私はその出力をアクセスするために何をすべきでしょうか?

答えて

1

.textは、パラメータとして関数をとり、d(datum)引数を内部的に呼び出して呼び出します。 .text機能を望んでいるので、だから、ちょうどあなた自身の匿名のものを作成し、dimensionLabelsへの呼び出しラッパー:コメント

d3.text方法に

.text(function(d){ 
    var string = dimensionLabels(d); 
    return string.split('[', 2); 
}) 

応答機能文字列またはのどちらかを取ることができますが文字列を返します。文字列を指定すると、その文字列にテキストが設定されます。関数に与えると、その関数はすぐにが呼び出されません。代わりに、フードの下にd3が後で呼び出されます。それが実行されると、引数はd引数に渡され、このd引数はそのDOM部分にバインドされたデータムです。 (ある時点で、コードは.dataコールでデータバインドされています)。

あなたがあるため、この行のdimensionLabels("myString")を呼び出すときに、エラーが発生します:

__.dimensions[d].title 

あなたはdimensionsの性質を持っている__という名前のいくつかのオブジェクトを持っています。

__.dimensions["myString"] 

戻り未定義:プロパティは配列やオブジェクト(あなたは確かに私のために十分なコードを提供してきたので、私は知らない)にインデックスを作成することができますいずれかです。 未定義は、titleという名前のプロパティを持つことはありません。そして、BAM、あなたはあなたのエラーを取得します。

+0

ありがとうございました!これは本当にうまくいったのですが、私は根底にあるロジックを把握していません。スクリプトはどのように* _ * *なるのですか?あなたが提案している無名関数内のdimensionLabels(d)を実行するとうまくいきますが、もしそれを外に出すと(例えば.text(dimensionLabels(d))、それはうまくいきません。また、もし私が.text(dimensionLabels( "myString"))を実行した場合、関数の条件付きリターン(_return dがfalse_の場合)に基づいて "myString"を取得してはいけませんか? TypeError:__。dimensions [d]は定義されていません。* .. – sc28

+0

@ sc28、上記の質問に対する私の回答を参照してください。 – Mark

1

dimensionLabelsは文字列ではなく、文字列を引数として取ります。それはプロパティの__オブジェクトを見ているよう

すると、それが見え、それはdimensionsという配列であり、そしてそのテキストとして使用するプロパティtitleを有していてもよく、インデックス[d]、探しています。そうでなければ、あなたはそれを与えた引数を返すだけですd

これを使用しようとすると、__.dimensions[d].titleの結果を返すために文字列を渡す必要があります。見つからない場合は、文字列を返します。dimensionsLabels("someText")のようになります。その後、あなたはあなたに戻って文字列を取得します、あなたは結果に、または全体のことに.split()を呼び出すことができます。あなたはそれが機能に.split()を呼び出してやっているdimensionsLabels("someText").split('[', 2)

方法、これ、ほとんどの部分はI信じて、.split()は文字列です。

+0

ありがとうございました。ワークフローのスペルが非常に役に立ちました。しかし、私は@ Markのレスポンスへの私のコメントに書いたように、関数の根底にあるメカニズムを私はまだよく分かりません。特に、文字列を関数に渡しても、それを返すことはありませんが、あなたが書いたように、 "title"プロパティが見つからなければ、与えられた引数dを返さなければなりません。 – sc28

関連する問題