Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular use jQuery plugin with object in external controller

I'm new to Angular and I wanted to use a jQuery Plugin (d3pie.js). I googled my need and I found few examples that explain that I have to create a directive and put in my parameters (and to be sincere it's a little bit confusing for a beginner like me).

My problem is that I didn't find how to use a plugin that requires an object as argument, knowing that this object is in an other controller ?

like image 534
Burawi Avatar asked Oct 31 '22 18:10

Burawi


1 Answers

Here is an example using bars, a controller that hods your data and a directive with D3. This was all found using this link but I modified it slightly for better angular code style. http://odiseo.net/angularjs/proper-use-of-d3-js-with-angular-directives.

  1. All your D3 logic and presentation must be contained within a directive
  2. Use HTML-declarative syntax to feed of data to your directive instances
  3. By doing that, you can store the data in your controller, passing it to your D3 directive via two-way data binding of parameters

angular.module('myApp', [])
  .controller('BarsController', function($scope) {
    $scope.myData = [10,20,30,40,60, 80, 20, 50];
  })
  //camel cased directive name
  //in your HTML, this will be named as bars-chart
  .directive('barsChart', function ($parse) {
    //explicitly creating a directive definition variable
    //this may look verbose but is good for clarification purposes
    //in real life you'd want to simply return the object {...}
    var directiveDefinitionObject = {
      //We restrict its use to an element
      //as usually  <bars-chart> is semantically
      //more understandable
      restrict: 'E',
      //this is important,
      //we don't want to overwrite our directive declaration
      //in the HTML mark-up
      replace: false,
      //our data source would be an array
      //passed thru chart-data attribute
      scope: {data: '=chartData'},
      link: function (scope, element, attrs) {
        //in D3, any selection[0] contains the group
        //selection[0][0] is the DOM node
        //but we won't need that this time
        var chart = d3.select(element[0]);
        //to our original directive markup bars-chart
        //we add a div with out chart stling and bind each
        //data entry to the chart
        chart.append("div").attr("class", "chart")
          .selectAll('div')
          .data(scope.data).enter().append("div")
          .transition().ease("elastic")
          .style("width", function(d) { return d + "%"; })
          .text(function(d) { return d + "%"; });
        //a little of magic: setting it's width based
        //on the data value (d)
        //and text all with a smooth transition
      }
    };
    return directiveDefinitionObject;
  });
.chart {
    background: #eee;
    padding: 3px;
}

.chart div {
  width: 0;
  transition: all 1s ease-out;
  -moz-transition: all 1s ease-out;
  -webkit-transition: all 1s ease-out;
}

.chart div {
  font: 10px sans-serif;
  background-color: steelblue;
  text-align: right;
  padding: 3px;
  margin: 5px;
  color: white;
  box-shadow: 2px 2px 2px #666;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp" ng-controller="BarsController">
    <bars-chart chart-data="myData"  ></bars-chart>
</div>
like image 158
Enkode Avatar answered Nov 11 '22 02:11

Enkode