2014-02-20 2 views
0

Я пытаюсь построить горизонтальную шкалу календаря, используя d3.js. Основная цель - выделить праздники и отпуск для пользователя.D3js: обновление данных не обновляет правые объекты

http://jsbin.com/ceperavu/2/edit?css,js,output

  • Я первый прямоугольник с 'начальной' даты до 'конца' даты.
  • Затем добавьте текст.
  • выделите прямоугольник, который соответствует данным из vacations
  • но это выдвигает на первый план всегда первым «п» Прямоугольник.

    var width = 650; 
    var height = 450; 
    var date = {start: '02/24/2014', end: '03/17/2014'}; 
    var day = d3.time.format("%d"); 
    var vacations = ['02/25/2014', '02/28/2014', '03/05/2014', '03/14/2014']; 
    var cell = {width: 20, height: 20}; 
    var format = d3.time.format("%m/%d/%Y"); 
    
    var chart = d3.select("body") 
           .append('svg:svg') 
           .attr('width', width) 
           .attr('height', height) 
           .attr('class', 'chart'); 
    
    
    
    var days = chart 
        .selectAll(".day") 
        .data(function(d) { return d3.time.days(new Date(date.start), new Date(date.end)); }) 
        .enter() 
        .append('svg:g'); 
    
    //add rect 
        days.append('svg:rect') 
         .attr('width', cell.width) 
         .attr('height', cell.height) 
         .attr('x', function(d, i){ 
         var day = d3.time.format("%d"); 
         // console.log(day(d)); 
         return i * cell.width; }) 
         .attr('class', 'day') 
         .append('title') 
         .text(function(d){return format(d);}) 
         .datum(format); 
    
    //add text 
        days.append('svg:text') 
         .attr('width', cell.width) 
         .attr('height', cell.height) 
         .attr('x', function(d, i){ 
         return i * cell.width + cell.width/4; 
         }) 
         .attr('y', 14) 
         // .style('text-anchor', 'middle') 
         // .style('dominant-baseline', 'central') 
         .text(function(d) { var day = d3.time.format("%d");return day(d); }); 
    
    //highlight holidays 
    d3.selectAll('rect.day').data(vacations).attr('class', 'holiday'); 
    

Это неправильно d3.selectAll('rect.day').data(vacations).attr('class', 'holiday');?

Редактировать: формат и дополнительные сведения.

ответ

-1

Вот Fiddle.

Проблема была с этим кодом рядом с переменной days.

 
var days = chart.selectAll(".day") 
    .data(function(d) { return d3.time.days(new Date(date.start), new Date(date.end)); }) 
     .enter() 
     .append('svg:g') 
    .attr('class', 'day'); 

Раньше было так.

 
var days = chart 
.selectAll(".day") 
    .data(function(d) { return d3.time.days(new Date(date.start), new Date(date.end)); }) 
     .enter() 
     .append('svg:g') 
    .attr('class', 'day'); 

Пожалуйста, проверьте это.

+1

Я не вижу никаких изменений, кроме удаления новой строки на первой линии. Я не решаю основной вопрос выделения дат, перечисленных в переменной 'vacations' – hashg

+0

Вы хотели выделить дни отпуска? –

+0

Да. Я хочу выделить дни отпуска. – hashg

3

Я немного изменил входные данные, чтобы вы могли сравнивать яблоки с яблоками, а также использовать вспомогательную функцию из jquery. This fiddle - результат. Надеюсь это поможет.

days.selectAll('rect.day') 
    .attr('class', function (d) { 
     return ($.inArray(d.getTime(), vacations)) > -1 ? 'holiday' : 'day'; 
    }); 
+1

Чтобы уточнить: Исходный код заменял данные о датах данными о каникулах; без ключевой функции новые данные были только назначены с самого начала. Код @FernOfTheAndes захватывает все прямоугольники и стилирует их, если их дата соответствует каникулярному дню. Вы можете поочередно использовать фильтр [d3] (https://github.com/mbostock/d3/wiki/Selections#wiki-filter) вместо выполнения проверки внутри вызова метода атрибута, но конечный эффект будет таким же. Фильтры предпочтительнее, если вы собираетесь устанавливать несколько атрибутов или стилей на основе тех же критериев фильтра. – AmeliaBR

+0

Кроме того, если у вас еще нет JQuery на вашей странице, вы можете использовать 'vacations.indexOf [d.getTime]> -1'. Он [не работает в IE8] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf), но также и ваша графика SVG. – AmeliaBR

+2

Для сравнения, скрипка с использованием формата фильтра: http://jsfiddle.net/3FrsG/1/ и использование стандартного Javascript-метода вместо JQuery: http://jsfiddle.net/3FrsG/2/ – AmeliaBR

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