亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何更新 d3 中綁定數據的索引 (i)?

如何更新 d3 中綁定數據的索引 (i)?

楊魅力 2023-07-14 15:44:27
在第一次輸入時,我將數據綁定到 svg,如下所示:var dateContainer = svg.selectAll("g.dateContainerClass")    .data(dateData, function(d) {       return d.id    });var dateContainerEnter = dateContainer.enter()    .append("g")    .attr("class", "dateContainerClass");此時,綁定數據由一個包含 5 個條目的數組組成。從第一個到最后一個也是i0 到 4。現在數組已更新:兩個新條目拼接在 0 和 1 之間。dateData.splice((i + 1), 0, rawData[(rawIndex + 1)], rawData[(rawIndex + 2)])之后,新的dateData將再次綁定到選擇,如上所示。我期待發生的是這樣的:i=0 (old)i=1 (new)i=2 (new)i=3 (old)i=4 (old)etc.實際發生的情況是這樣的:i=0 (old)i=1 (new)i=2 (new)i=1 (old)i=2 (old)etc.我做錯了什么還是這是預期的行為?任何幫助將非常感激!
查看完整描述

1 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

當您設置.attr("id"一個函數時,該函數會立即執行,并且僅執行一次。這意味著當您將新值插入數據數組時,您還需要重新計算該屬性。如果您移動.attr("id"到之后.merge,一切都會按預期進行:


var windowWidth = window.innerWidth;

var storyline = d3.select(".Storyline").append("svg");


function update(dateData, rawData) {

  console.log(dateData)

  var x = d3.scaleLinear()

    .domain([0, (dateData.length - 1)])

    .range(["10%", "80%"]);


  storyline

    .transition()

    .duration(500)

    .delay(50)

    .attr("width", (dateData.length * 20) + "%")

    .attr("height", "100%")


  var dateFlags = storyline.selectAll("g.dateflag")

    .data(dateData, function(d, i) {

      return d

    });


  //ENTER


  var dateFlagsEnter = dateFlags.enter()

    .append("g")

    .attr("class", "dateflag");


  dateFlagsEnter.append("foreignObject")

    .attr("class", "timePoints")

    .attr("width", "130px")

    .attr("height", "100%")

    .attr("x", function(d, i) {

      return x(i);

    })

    .attr("y", function(d, i) {

      var topBottom;

      if ((i % 2) == 1) {

        topBottom = "35%";

      } else {

        topBottom = "40%";

      }

      return topBottom;

    })

    .attr("opacity", "0%");


  dateFlagsEnter.select(".timePoints").append("xhtml:div")

    .attr("class", "tpGroup")


  dateFlagsEnter.select(".tpGroup").append("xhtml:div")

    .attr("id", "dateLabel")

    .append("xhtml:div")

    .html(function(d, i) {

      return d + " index= " + i;

    })

    .attr("id", "dateLabelText")

    .on("click", function(d, i) {

      var clickIndex = i

      console.log("clickedID: " + clickIndex)

      expand(dateData, clickIndex);

    });


  //UPDATE


  dateFlags.merge(dateFlagsEnter)

    .attr("id", function(d, i) {

      console.log("ContainerID: " + i)

      return i

    })

    .select(".timePoints")

    .transition()

    .duration(500)

    .delay(50)

    .attr("x", function(d, i) {

      return x(i);

    })

    .attr("opacity", "100%");


  dateFlags.merge(dateFlagsEnter).select("#dateLabelText")

    .html(function(d) {

      return d;

    });


  //EXIT


  dateFlags.exit().remove();


};


function expand(dateData, clickIndex) {

  var lineIndex = clickIndex


  dateData.splice((lineIndex + 1), 0, "Day1.1", "Day1.2")

  update(dateData);

};


function getDateData() {

  var dateData = ["Day1", "Day2", "Day3", "Day4", "Day5", ]

  update(dateData);

};


getDateData();

<div class="Storyline"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>


查看完整回答
反對 回復 2023-07-14
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號