2012-05-22 12 views
8

私はデータに基づいてコンテンツを生成するためにd3.jsライブラリを使用しています。d3.jsでデータを再バインドする最良の方法

ここでは簡単な例を示します。

data_arr = [0,1,2,3,4]; 
d3.select("#mylist").selectAll('li').data(data_arr).enter().append("li").html(
    function(d) 
    { 
     var element = document.createElement('div'); 
     element.innerHTML = '<div id="innerDiv">' + d + '</div>'; 
     return element.innerHTML; 
    }); 

私の配列を変更した場合、たとえば、新しいデータは[5,3]です。新しいHTMLを再バインドして表示するにはどうすればよいでしょうか?私は同じ文章をもう一度呼び出す必要がありますか、それとも良い方法ですか?

もっと複雑なデータ構造の場合を考えてみましょう。私はobj1.field = 'newValueに' を実行どうなり すなわち

data_arr = [obj1, obj2, obj3, obj4]; 

element.innerHTML = '<div id="innerDiv">' + d.field + '</div>'; 

。リバインドはどのように行われますか?

ありがとうございます!

答えて

18

関数を使用します。例えば、ここでは文字列の配列からリストを移入する関数です:今、あなたのリストを初期化したい場合は

function list(ul, data) { 
    var li = ul.selectAll("li").data(data); 
    li.exit().remove(); 
    li.enter().append("li"); 
    li.text(function(d) { return d; }); 
} 

は、あなたが言うことができます。

d3.select("#list").call(list, [0, 1, 2, 3, 4]); 

を、後であなたがしたい場合はアップデート、あなたが言うことができます:あなたは(あなたは、メソッドチェーンを必要としない)希望する場合

d3.select("#list").call(list, [5, 3]); 

は、あなたがselection.callことなくこれを書くことができます。

list(d3.select("#list"), [5, 3]); 
+0

私のシナリオは少し複雑です。私のデータは複雑なオブジェクトです。私がdata_arr = [obj1、obj2、obj3]を持っていれば;私はobj1.field = newvalueを変更します。私は再バインドしたい場合はどうなりますか? d3.select( "#mylist")を作成する必要がありますか?selectAll( 'li')。remove();もう一度 "list"関数を呼び出しますか?より良い方法がありますか? – Tony

+0

いいえ、すべてのli要素を削除する必要はありません。 data-joinは既存の要素のみを削除します。オブジェクトを追加したり削除したりせずにデータを更新した場合、 'd3.select("#list ")。call(list、data)'だけで表示を更新することができます。この場合、入力と終了の選択は空です。 – mbostock

+0

ただし、オブジェクトの特定のフィールドが変更されている場合は、#innerDivコンテンツは更新されません。または私は何か間違っている? dinner.itlect( "#list")call(list、data)#innerDivの内容をd.fieldの新しい値で更新しますか? – Tony

関連する問題