Переключение между наборами данных в D3.js показывает неожиданное поведение

#javascript #d3.js

#javascript #d3.js

Вопрос:

Я хочу иметь возможность переключаться между двумя наборами данных с помощью D3.js. Когда я переключаюсь, я хочу, чтобы старый набор данных исчезал, в то же время новый набор данных исчезает.

Я уже некоторое время работаю над этим кодом, но я не получаю желаемого поведения. Найдите следующую скрипку и попробуйте щелкнуть по текстовым наборам данных1 и наборам2.

Например, когда я сначала нажимаю Dataset1, все работает нормально, но когда я позже нажимаю Dataset2, я не получаю все значения Dataset2. Если я сейчас снова нажму Dataset1, ничего не произойдет, и мне придется дублировать щелчок, чтобы все заработало. Также мне никогда не удается отобразить все девять элементов Dataset2.

Чего мне не хватает?

 var dataset1 = [1,2,3,4],
    dataset2 = [1,2,3,4,5,6,7,8,9],
    svg = d3.select("body").append("svg");

update = function(newDataset){
    var allArrows = svg.selectAll(".arrow"),
        addNew; 

    addNew = function (){
            allArrows
            .data(newDataset)
            .enter()
            .append("line")
            .attr({
                opacity : 0,
                "stroke-width" : 1,
                stroke : "blue",
                class : "arrow",
                x1 : 10,
                y1 : function (d, i) { return 10 * i   10 },
                x2 : 50,
                y2 : function (d, i) { return 10 * i   10}
            })
            .transition()
            .duration(500)
            .attr({
                opacity : 1
            });
    });

    if ( !allArrows.empty() ) {
        allArrows
        .data([])
        .exit()
        .transition()
        .duration(500)
        .attr("opacity", 0);
        .remove();
        addNew();
    }
    else {
        addNew();
    }
    return chart;
};
  

http://jsfiddle.net/favetelinguis/pWqLL/1/

Комментарии:

1. Ваш jsfiddle у меня не работает.

2. Нет, вы правы, не знаете, почему это так? Он отлично работает в моем локальном браузере Chrome. Сейчас я обновил код, поэтому попробуйте еще раз, иначе посмотрите, работает ли он в вашей локальной системе…

3. Причина, по которой остаются элементы, заключается в переходе, который вы используете при выходе из данных. Код для добавления новых строк учитывает их и, следовательно, добавляет меньше, чем вы ожидали. Он отлично работает без перехода: jsfiddle.net/pWqLL/2

4. да, но почему это? Странно, что я пытался всеми способами удалить старые элементы перед добавлением новых один раз, но я просто не могу заставить их исчезнуть.

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