2014-12-17 8 views
0

Каков рекомендуемый шаблон в D3 при абстрагировании «компонентов»?привязка данных к родительскому узлу в D3 вместо выбора - шаблон

Предположим, у меня есть список. Обычно я хотел бы сделать

d3.select('ol') 
    .selectAll('li') 
    .data(array) 
    .enter() 
    .append('li') 
    .text(_.property('label')) 

Однако, когда абстрагирования на это в компонент, в месте использования, я хотел бы просто сделать

d3.select('ol') 
    .data(array) 
    .call(component) 

Проблема заключается в том, что данные должны быть связаны .selectAll, поэтому людям нужно будет делать .selectAll по месту использования, но это нарушает абстракцию (люди должны знать, какой тип элемента будет добавляться этим компонентом)

ответ

1

Интересное предложение.
Я реализовал «компонент», как этот, и проверил его работу.
(Источник модифицирован немного для моего теста.)
Я хочу знать withount решения с использованием __data__ ...

var array = [ 
    {label: 'label1'}, 
    {label: 'label2'}, 
    {label: 'label3'}, 
    {label: 'label4'}, 
    {label: 'label5'} 
] 

function component(selection) { 
    selection.selectAll('li') 
     .data(selection.datum()) // edited to use .datum() instead of selection[0][0].__data__ 
     .enter() 
     .append('li') 
     .text(_.property('label')) 
} 

d3.select('ol') 
    .datum(array) 
    .call(component) 
+0

Спасибо. Я не знал, что D3 задает '.call()' ed функцию 'this' для выбора. В любом случае, я думаю, что 'selection.datum()' будет возвращать данные, я попробую это. Но если нет, эта версия будет работать. –

+1

Спасибо, Питер за то, что я изменил свой код. Это должен быть правильный ответ. – toshi

Смежные вопросы