15

I created a pie chart with chartjs, but when I click on a specific slice, the click event is not taken.

View:

<div ng-controller="ProjectsController">
<a>Projects</a>
<br>
</br>
<canvas id="myPieChart" width="600" height="600" ng-click="chartClick()"></canvas>

Controller:

'use strict';

angular.module('Progs')

.controller('ProjectsController', ['$scope', '$rootScope', '$http', '$window', '$state',
function ($scope, $rootScope, $http, $window, $state) {
  //...
  $scope.chartClick = function (event) {
    console.log('chartClick');
    //console.log("segment: " + $scope.chart.getSegmentsAtEvent(event));
  }
  //...
}

What's wrong with my code?

Please note: I am not using angular-chart.js

Mihriban Minaz
  • 3,043
  • 2
  • 32
  • 52
eeadev
  • 3,662
  • 8
  • 47
  • 100

3 Answers3

9

I studied your problem and be reading @MohammadMansoor's answer I tried to implement the solution for you.

(function(angular) {
  var app = angular.module("app", []);
  app.controller("ChartCtrl", ['$scope', function($scope) {
    $scope.hello = "Hello, World";
    $scope.canvas = document.getElementById("myPieChart");
    $scope.ctx = $scope.canvas.getContext("2d");
    $scope.data = [{
      value: 300,
      color: "#F7464A",
      highlight: "#FF5A5E",
      label: "Red"
    }, {
      value: 50,
      color: "#46BFBD",
      highlight: "#5AD3D1",
      label: "Green"
    }, {
      value: 100,
      color: "#FDB45C",
      highlight: "#FFC870",
      label: "Yellow"
    }];
    $scope.myPieChart = new Chart($scope.ctx).Pie($scope.data,{});
    $scope.chartClick = function (event) {
        console.log('chartClick');
        console.log($scope.myPieChart.getSegmentsAtEvent(event));
    }
    $scope.canvas.onclick = $scope.chartClick;
  }]);
})(angular);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.js"></script>

<div ng-app="app" ng-controller="ChartCtrl">
  <h1>{{hello}}</h1>
  <a>Projects</a>
  <br>
  <canvas id="myPieChart" width="600" height="600"></canvas>
</div>

here is the plunk for the same implementation

Minato
  • 4,383
  • 1
  • 22
  • 28
  • can you please see my question http://stackoverflow.com/questions/37256487/i-want-to-change-the-chart-for-each-city-or-subcity-selected – Abderrahim May 17 '16 at 13:15
5

Use html onclick feature and access the scope using any id

Example:

<canvas id="myPieChart" width="600" height="600" onclick="angular.element("#myPieChart").scope().chartClick();"></canvas>
Mohammed mansoor
  • 743
  • 3
  • 11
  • 18
  • how do u get for instance the label of the slice in such case? – eeadev Feb 04 '16 at 07:57
  • when I click on each slice of myPieChart, how do I get (in my controller) a reference to the slice I have clicked? If, for instance, I want to get some value of data, having data = [ { value: 300, color:"#F7464A", highlight: "#FF5A5E", label: "Red" }..., – eeadev Feb 04 '16 at 09:56
  • You can pass parameters like angular.element("#myPieChart").scope().chartClick('test_arg'); and inside angular fucntion you may get it as normal.Try without single quotes also if it is ot working – Mohammed mansoor Feb 04 '16 at 10:17
  • please could u edit your response adding also the function to use inside the controller? many thanks – eeadev Feb 04 '16 at 10:28
3

If you are using angular-chart please use chart-click = "chartClick".

I guess the chart.js overrides the click event and doesn't pass it on to angular, so you can't get a ng-click event triggered.

You could try binding the click event externally using angular.element('#myPieChart') but I am not sure about it.

Minato
  • 4,383
  • 1
  • 22
  • 28