2017-05-25 21 views
7

Tôi đang cố gắng xây dựng treelist và treemap trong trang html đơn bằng cách sử dụng d3.js. Treelist và treemap của tôi đang hoạt động tốt trên các trang riêng lẻ, nhưng tôi muốn kết hợp chúng vào trang html đơn.Sử dụng các phiên bản D3 khác nhau trên cùng một trang html

Vấn đề tôi đang phải đối mặt là, cho TreeList tôi đang sử dụng d3.js phiên bản 3 và cho treemap tôi đang sử dụng d3.js phiên bản 4. Vì vậy, khi tôi cố gắng để nhúng chúng vào trang duy nhất của tôi có xung đột phiên bản (nó chỉ cho thấy treemap).

Vui lòng hướng dẫn cho tôi cách tôi giải quyết xung đột phiên bản.

Tiếp theo là mã d3.js của tôi với phiên bản 3 (lần đầu tiên col-md-4) và phiên bản 4 (col-md-8)

<script src="http://d3js.org/d3.v3.min.js"></script> 
<div class="row"> 
    <div class="col-md-4"> 
     <div id="treelisttest" style="height:500px;"> </div> 

     <script> 

        var id = 0; 
        d3.json("data.json", function (err, data) { 

         var tree = d3.layout.treelist() 
           .childIndent(10) 
           .nodeHeight(30); 

         var ul = d3.select("#treelisttest").append("ul").classed("treelist", "true"); 

         function render(data, parent) { 
          var nodes = tree.nodes(data), 
           duration = 250; 
          function toggleChildren(d) { 

           if (d.children) { 
            d._children = d.children; 
            d.children = null; 
           } else if (d._children) { 
            d.children = d._children; 
            d._children = null; 
           } 
          } 

          var nodeEls = ul.selectAll("li.node").data(nodes, function (d) { 
           d.id = d.id || ++id; 
           return d.id; 
          }); 

          var entered = nodeEls.enter().append("li").classed("node", true) 
           .style("top", parent.y + "px") 
           .style("opacity", 0) 
           .style("height", tree.nodeHeight() + "px") 
           .on("click", function (d) { 
            toggleChildren(d); 
            render(parent, d); 
           }) 
           .on("mouseover", function (d) { 
            d3.select(this).classed("selected", true); 
           }) 
           .on("mouseout", function (d) { 
            d3.selectAll(".selected").classed("selected", false); 
           }); 

          entered.append("span").attr("class", function (d) { 
           var icon = d.children ? " glyphicon-chevron-down" 
            : d._children ? "glyphicon-chevron-right" : ""; 
           return "caret glyphicon " + icon; 
          }); 

          entered.append("span").attr("class", function (d) { 
           var icon = d.children || d._children ? "glyphicon-folder-close" 
            : "glyphicon-file"; 
           return "glyphicon " + icon; 
          }); 

          entered.append("span").attr("class", "filename") 
          .html(function (d) { return d.name.substring(0, 5) }); 

          nodeEls.select("span.caret").attr("class", function (d) { 
           var icon = d.children ? " glyphicon-chevron-down" 
            : d._children ? "glyphicon-chevron-right" : ""; 
           return "caret glyphicon " + icon; 
          }); 

          nodeEls.transition().duration(duration) 
           .style("top", function (d) { return (d.y - tree.nodeHeight()) + "px"; }) 
           .style("left", function (d) { return d.x + "px"; }) 
           .style("opacity", 1); 
          nodeEls.exit().remove(); 
         } 

         render(data, data); 

        }); 
     </script> 

    </div> 
    <div class="col-md-8"> 
     <div id="maptest"> 

      <script src="http://d3js.org/d4.v3.min.js"></script> 


      <svg width="500" height="1000"></svg> 

      <script src="d3.v4.min.js"></script> 
      <script> 
       var svg = d3.select("#maptest") 
         .append("svg") 
         .attr("width", "100%") 
         .attr("height", "50%") 
         .call(d3.zoom().on("zoom", function() { 
          svg.attr("transform", d3.event.transform) 
         })) 
         .append("g") 



      var treemap = d3.treemap() 
       .tile(d3.treemapResquarify) 
       .size([1000, 1000]) 
       .round(true) 
       .paddingInner(1); 

      d3.json("data.json", function (error, data) { 
       if (error) throw error; 

      var root = d3.hierarchy(data) 
       .sum(sumBySize) 

       treemap(root); 

       var cell = svg.selectAll("g") 
        .data(root.leaves()) 
        .enter().append("g") 
        .attr("transform", function (d) { return "translate(" + d.x0 + "," + d.y0 + ")"; }); 

       cell.append("rect") 
        .attr("id", function (d) { return d.data.id; }) 
        .attr("width", function (d) { return d.x1 - d.x0; }) 
        .attr("height", function (d) { return d.y1 - d.y0; }) 
        .attr("fill", function (d) { return color(d.data.value); }); 

       cell.append("clipPath") 
        .attr("id", function (d) { return "clip-" + d.data.id; }) 
        .append("use") 
        .attr("xlink:href", function (d) { return "#" + d.data.id; }); 

       cell.append("text") 
        .attr("dy", ".75em") 
        .text(function (d) { return d.data.name.substring(0, 1); }) 

       cell.append("title") 
        .text(function (d) { return d.data.id + " with name " + d.data.name }); 
      }); 


     function sumByCount(d) { 
      return d.children ? 0 : 1; 
     } 

     function sumBySize(d) { 
      return d.value; 
     } 

      </script> 
     </div> 
    </div> 
</div> 
+0

Bạn có nhận được bất kỳ sai sót trong chrome console? –

+0

không có i am không nhận được lỗi – Bob

+0

Nó có thể là treemap của bạn được dựng hình trong cùng một container như treelist. Bạn có một codepen hoặc một cái gì đó với mã? –

Trả lời

6

Bạn có thể tải phiên bản 3 của kịch bản trong nước và thay đổi dòng cuối cùng từ

this.d3 = d3; 

để

this.d3v3 = d3; 

Vì vậy, bạn có thể sử dụng phiên bản 4 d3 gọi d3, và phiên bản 3 của thư viện gọi d3v3

+0

:) đơn giản và hiệu quả – bumbeishvili

2

(Tôi không biết tại sao bạn đang cố thực hiện việc này hoặc nếu điều này thực sự cần thiết. Hãy nhớ rằng Tôi chỉ trả lời câu hỏi của bạn, nghĩa là cách sử dụng D3 v3 và v4 trong cùng một trang, mà không phân tích mục tiêu của bạn hoặc nếu đây là XY problem).

Như bạn phải biết bây giờ, bạn có thể không chỉ cần tham khảo cả hai phiên bản trong HTML:

<script src="https://d3js.org/d3.v4.min.js"></script> 
<script src="https://d3js.org/d3.v3.min.js"></script> 

Bởi vì, rõ ràng, rằng sẽ gây ra một cuộc xung đột khi bạn sử dụng d3 để gọi các phương pháp.

Do đó, giải pháp là tải xuống một trong hai phiên bản và thay đổi mã nguồn.

Trong giải pháp này, tôi sẽ thay đổi mã nguồn của phiên bản v4.x (được rút gọn) và sử dụng tham chiếu thông thường cho v3. Bạn có thể làm theo cách khác xung quanh (như Daniela đã làm trong her answer), nhưng các bước không giống nhau.

Trong D3 v4.x (minified), bạn thấy điều này ngay từ đầu:

// https://d3js.org Version 4.9.1. Copyright 2017 Mike Bostock. 
(function(t, n) { 
    "object" == typeof exports && "undefined" != typeof module ? 
     n(exports) : "function" == typeof define && define.amd ? 
     define(["exports"], n) : n(t.d3 = t.d3 || {}) 
}) etc... 

gì tôi sẽ làm là thay đổi mà t.d3 để t.d3v4 (hoặc bất kỳ tên khác mà bạn muốn).

Sau đó, bạn có thể sử dụng d3 để gọi các hàm D3 v3 và d3v4 (không phải d3) để gọi các hàm v4 D4 của mình.

Giống như trong ví dụ này:

var scalev3 = d3.scale.linear() 
    //note: ^----- use `d3` for D3 v3 functions 
    .range([0, 5000]) 

var scalev4 = d3v4.scaleLinear() 
    //note:  ^----- use `d3v4` for D3 v4 functions 
    .range([0, 200]); 

console.log(scalev3(0.4))//logs 2000, as expected. 
console.log(scalev4(0.4))//logs 80, as expected. 

Đây là plunker với mã rằng: https://plnkr.co/edit/h174Gcc3YSCJGpNljCOh?p=preview

0

tôi Sử dụng RequireJS để giải quyết vấn đề này

  • TreeList d3 Version: 3

     require(["js/common/d3.v3.min"], function(d3) { 
         // tree list code here 
         }); 
    
  • treemap d3 Version: 4

    require(["js/common/d3.v4.min"], function(d3) {  
    // treemap code here 
    

    }

Lưu ý: Bạn cần phải nhập khẩu tập tin require.js: tải về từ đây

http://requirejs.org/docs/1.0/docs/download.html

đặt câu lệnh nhập vào cuối phần thân thẻ ví dụ:

< body>

// đang ....

</body>

Các vấn đề liên quan