2016-05-09 17 views
14

Tôi vừa bắt đầu làm việc với Chart.js và tôi rất thất vọng rất nhanh. Tôi có biểu đồ thanh xếp chồng lên nhau, nhưng tôi không thể nhấp vào "sự kiện" để hoạt động.Chart.js: Biểu đồ thanh Nhấp vào Sự kiện

Tôi đã tìm thấy một số comment on GitHub by nnnick từ Chart.js để sử dụng hàm getBarsAtEvent, mặc dù không thể tìm thấy hàm này trong Chart.js documentation (tiếp tục, thực hiện tìm kiếm). Tài liệu này đề cập đến hàm getElementsAtEvent của tham chiếu chart, nhưng điều đó chỉ dành cho Biểu đồ đường kẻ.

tôi đặt một event listener (đúng cách) trên yếu tố canvas của tôi:

canv.addEventListener('click', handleClick, false); 

... nhưng trong chức năng handleClick tôi, chart.getBarsAtEvent là undefined!

Bây giờ, trong tài liệu Chart.js, có một tuyên bố về một cách khác để đăng ký sự kiện nhấp cho biểu đồ thanh. Nó khác nhiều so với bình luận của nnnick về GitHub từ 2 năm trước.

Trong Global Chart Defaults bạn có thể đặt chức năng onClick cho biểu đồ của mình. Tôi đã thêm một chức năng onClick vào cấu hình biểu đồ của mình và không có gì ...

Vì vậy, làm cách nào để tôi nhận được cuộc gọi lại nhấp để làm việc cho biểu đồ thanh của mình ?!

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn!

P.S .: Tôi không sử dụng bản dựng chính từ GitHub. Tôi đã thử, nhưng nó tiếp tục la hét rằng require is undefined và tôi đã không sẵn sàng để bao gồm CommonJS chỉ để tôi có thể sử dụng thư viện biểu đồ này. Tôi thà viết biểu đồ dang của riêng mình. Thay vào đó, tôi đã tải xuống và đang sử dụng phiên bản Standard Build mà tôi đã tải xuống ngay từ liên kết ở đầu số documentation page.

VÍ DỤ: Dưới đây là một ví dụ về cấu hình tôi đang sử dụng:

var chart_config = { 
    type: 'bar', 
    data: { 
     labels: ['One', 'Two', 'Three'], 
     datasets: [ 
      { 
       label: 'Dataset 1', 
       backgroundColor: '#848484', 
       data: [4, 2, 6] 
      }, 
      { 
       label: 'Dataset 2', 
       backgroundColor: '#848484', 
       data: [1, 6, 3] 
      }, 
      { 
       label: 'Dataset 3', 
       backgroundColor: '#848484', 
       data: [7, 5, 2] 
      } 
     ] 
    }, 
    options: { 
     title: { 
      display: false, 
      text: 'Stacked Bars' 
     }, 
     tooltips: { 
      mode: 'label' 
     }, 
     responsive: true, 
     maintainAspectRatio: false, 
     scales: { 
      xAxes: [ 
       { 
        stacked: true 
       } 
      ], 
      yAxes: [ 
       { 
        stacked: true 
       } 
      ] 
     }, 
     onClick: handleClick 
    } 
}; 
+0

tôi thấy rằng tôi đã có thể có 'chức năng onClick' tôi gọi bằng cách thiết lập 'chart.config.options.onClick = handleClick' nhưng điều này không giúp tôi tìm thấy những gì một phần của biểu đồ của tôi là nhấp vào. Về cơ bản, điều này giống như thiết lập trình lắng nghe sự kiện của tôi trên nút 'canvas'. – WebWanderer

Trả lời

28

tôi quản lý để tìm ra câu trả lời cho câu hỏi của tôi bằng cách nhìn qua Chart.js source code.

Được cung cấp tại dòng 3727 của Chart.js, Standard Build, là phương pháp .getElementAtEvent. Phương thức này trả về cho tôi "phần tử biểu đồ" đã được nhấp vào. Có dữ liệu đầy đủ ở đây để xác định dữ liệu nào sẽ hiển thị trong chế độ xem chi tiết của tập dữ liệu được nhấp vào.

Trên chỉ mục đầu tiên của mảng được trả về bởi chart.getElementAtEvent là một giá trị _datasetIndex. Giá trị này hiển thị chỉ mục của tập dữ liệu đã được nhấp vào.

Thanh cụ thể đã được nhấp vào, tôi tin, được ghi nhận bằng giá trị _index. Trong ví dụ của tôi trong câu hỏi của tôi, _index sẽ trỏ đến One trong chart_config.data.labels.

chức năng My handleClick bây giờ trông như thế này:

function handleClick(evt) 
{ 
    var activeElement = chart.getElementAtEvent(evt); 

..where chart là tài liệu tham khảo của biểu đồ được tạo ra bởi biểu đồ.js khi thực hiện:

chart = new Chart(canv, chart_config); 

Tập dữ liệu cụ thể được chọn bằng cách nhấp chuột do đó có thể được tìm thấy như:

chart_config.data.datasets[activeElement[0]._datasetIndex].data[activeElement[0]._index]; 

Và có bạn có nó. Bây giờ tôi có một datapoint mà tôi có thể xây dựng một truy vấn từ để hiển thị dữ liệu của thanh đã được nhấp vào.

+1

Đây cũng là những gì tôi đã tìm thấy sau nhiều giờ (vô vọng) tìm kiếm trong tài liệu. Nhưng vấn đề của tôi là, nó trả về cho tôi tất cả các tập dữ liệu, vì vậy 'activeElement [0] ._ datasetIndex' vẫn giống nhau - không, không có vấn đề gì trên thanh tôi nhấp! '_index' đang hoạt động. Bạn không có cùng một vấn đề? –

+0

Tôi chưa gặp sự cố này @ JánJanočko, nhưng tôi chưa làm việc với Chart.js kể từ bài đăng này. Tôi cần phải xem xét lại nó, vì tôi có thể thấy rằng có một số vấn đề với tiện ích biểu đồ mà tôi đã tạo. Tôi sẽ giữ cho bạn được đăng trên những phát hiện của tôi. – WebWanderer

+1

Cảm ơn @WebWanderer. Nhận được rằng activeElement là chìa khóa. Trong trường hợp của tôi, tôi chỉ có thể sử dụng 'label' của biểu đồ và sau đó thực hiện một' switch() 'trên nó. Sau đó, mỗi trường hợp "": 'sẽ làm một điều nào đó, cho tôi chỉ cần đi đến một trang web khác:' window.location.href = "/ myLabelPage"; '. –

3

Thực hiện tốt! Điều này dường như trả về giá trị dữ liệu được lập biểu đồ mặc dù, trong nhiều trường hợp có thể có thể xuất hiện nhiều hơn một lần, do đó làm cho nó không rõ ràng những gì đã được nhấp vào.

Điều này sẽ trả về nhãn dữ liệu thực tế của thanh được nhấp vào. Tôi thấy điều này hữu ích hơn khi đi sâu vào một danh mục.

chart_config.data.labels[activeElement[0]._index] 
1

Tôi có thể thực hiện công việc này theo cách khác. Có thể không được hỗ trợ, nhưng đôi khi, tôi thấy rằng cả nhãn cũng như giá trị đều không đủ để có được thông tin cần thiết để điền thông tin.

Vì vậy, những gì tôi đã làm là thêm một bộ tùy chỉnh các thuộc tính số liệu:

var ctx = document.getElementById("cnvMyChart").getContext("2d"); 
if(theChart != null) {theChart.destroy();} 
theChart = new Chart(ctx, { 
type: typ, 
data: { 
labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], 
datakeys: ["thefirstone","thesecondone","thethirdone","thefourthone","thefifthone","thesixthone"], 
datasets: [{ 
    label: '# of Votes', 
    data: [12, 19, 3, 5, 2, 3], 

... vv

Sau đó, khi tôi cần phải nhấn phím drillthrough vào một cuộc gọi ajax, tôi đã có thể có được nó với điều này:

var theDrillThroughKey = theChart.config.data.datakeys[activePoints[0]._index]; 

vì vậy, tôi thực sự không chắc chắn rằng nó thích hợp để có thêm các yếu tố tùy vào dữ liệu cho các bảng xếp hạng, nhưng nó làm việc cho đến nay trong Chrome, IE và Firefox . Tôi cần thiết để có thể đưa thêm thông tin vào phần giới thiệu mà tôi thực sự muốn hiển thị.

Ví dụ về điều đầy đủ: https://wa.rrdsb.com/chartExamples

Suy nghĩ?

0

Hãy nói rằng bạn tuyên bố một biểu đồ sử dụng một phương pháp như vậy:

window.myBar = new Chart({chart_name}, { 
     type: xxx, 
     data: xxx, 
     events: ["click"], 
     options: { 
      ... 
     } 
    }); 

Cách tốt nhất để bày tỏ ý onclick sự kiện sẽ bao gồm nghe cho vải nhấp chuột, như vậy:

({chart_name}.canvas).onclick = function(evt) { 
    var activePoints = myBar.getElementsAtEvent(evt); 
    // let's say you wanted to perform different actions based on label selected 
    if (activePoints[0]._model.label == "label you are looking for") { ... } 
} 
12

Hi đây là sự kiện nhấp chuột trong các tùy chọn nhận giá trị từ x và trục y

onClick: function(c,i) { 
    e = i[0]; 
    console.log(e._index) 
    var x_value = this.data.labels[e._index]; 
    var y_value = this.data.datasets[0].data[e._index]; 
    console.log(x_value); 
    console.log(y_value); 
} 
+0

Tôi gặp lỗi khi Không thể đọc thuộc tính '0' không xác định cho i –

+0

, hãy đăng ký plunker –

0

Tôi tìm thấy giải pháp này tại https://github.com/valor-software/ng2-charts/issues/489

public chartClicked(e: any): void { 
    if (e.active.length > 0) { 
    const chart = e.active[0]._chart; 
    const activePoints = chart.getElementAtEvent(e.event); 
    if (activePoints.length > 0) { 
    // get the internal index of slice in pie chart 
    const clickedElementIndex = activePoints[0]._index; 
    const label = chart.data.labels[clickedElementIndex]; 
    // get value by index 
    const value = chart.data.datasets[0].data[clickedElementIndex]; 
    console.log(clickedElementIndex, label, value) 
    } 
} 
} 
Các vấn đề liên quan