D3js: обновление данных не обновляет нужные объекты

0

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

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

  • Сначала я начинаю с даты "начала" до "конца".
  • Затем добавьте текст.
  • выделите прямоугольник, который соответствует данным из vacations
  • но он всегда выделяет первый "n" rect.

    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'); ?

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

Теги:
d3.js

2 ответа

3

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

days.selectAll('rect.day')
    .attr('class', function (d) {
        return  ($.inArray(d.getTime(), vacations))  > -1 ? 'holiday' : 'day';
    });
  • 1
    Для уточнения: исходный код заменял данные о датах данными об отпусках; без ключевой функции новые данные просто назначались с самого начала. Код @FernOfTheAndes захватывает все прямоугольники и стилизует их, если их дата совпадает с днем отпуска. Вы можете поочередно использовать фильтр d3 вместо проверки в вызове метода атрибута, но конечный эффект будет таким же. Фильтры предпочтительнее, если вы собираетесь установить несколько атрибутов или стилей на основе одинаковых критериев фильтра.
  • 0
    Также, если у вас еще нет JQuery на вашей странице, вы можете использовать vacations.indexOf[d.getTime] > -1 . Это не работает в IE8 , но и ваша SVG графика.
Показать ещё 6 комментариев
-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
  • 0
    Вы хотели выделить дни отпуска?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню