117 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# New Charts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Chart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be written as needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								Chart.controllers.MyType = Chart.DatasetController.extend({
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Now we can create a new instance of our chart, using the Chart.js API
							 | 
						||
| 
								 | 
							
								new Chart(ctx, {
							 | 
						||
| 
								 | 
							
								    // this is the string the constructor was registered at, ie Chart.controllers.MyType
							 | 
						||
| 
								 | 
							
								    type: 'MyType',
							 | 
						||
| 
								 | 
							
								    data: data,
							 | 
						||
| 
								 | 
							
								    options: options
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Dataset Controller Interface
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Dataset controllers must implement the following interface.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // Create elements for each piece of data in the dataset. Store elements in an array on the dataset as dataset.metaData
							 | 
						||
| 
								 | 
							
								    addElements: function() {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Create a single element for the data at the given index and reset its state
							 | 
						||
| 
								 | 
							
								    addElementAndReset: function(index) {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Draw the representation of the dataset
							 | 
						||
| 
								 | 
							
								    // @param ease : if specified, this number represents how far to transition elements. See the implementation of draw() in any of the provided controllers to see how this should be used
							 | 
						||
| 
								 | 
							
								    draw: function(ease) {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Remove hover styling from the given element
							 | 
						||
| 
								 | 
							
								    removeHoverStyle: function(element) {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Add hover styling to the given element
							 | 
						||
| 
								 | 
							
								    setHoverStyle: function(element) {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Update the elements in response to new data
							 | 
						||
| 
								 | 
							
								    // @param reset : if true, put the elements into a reset state so they can animate to their final values
							 | 
						||
| 
								 | 
							
								    update: function(reset) {}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following methods may optionally be overridden by derived dataset controllers.
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // Initializes the controller
							 | 
						||
| 
								 | 
							
								    initialize: function(chart, datasetIndex) {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Ensures that the dataset represented by this controller is linked to a scale. Overridden to helpers.noop in the polar area and doughnut controllers as these
							 | 
						||
| 
								 | 
							
								    // chart types using a single scale
							 | 
						||
| 
								 | 
							
								    linkScales: function() {},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Called by the main chart controller when an update is triggered. The default implementation handles the number of data points changing and creating elements appropriately.
							 | 
						||
| 
								 | 
							
								    buildOrUpdateElements: function() {}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Extending Existing Chart Types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Extending or replacing an existing controller type is easy. Simply replace the constructor for one of the built in types with your own.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The built in controller types are:
							 | 
						||
| 
								 | 
							
								* `Chart.controllers.line`
							 | 
						||
| 
								 | 
							
								* `Chart.controllers.bar`
							 | 
						||
| 
								 | 
							
								* `Chart.controllers.radar`
							 | 
						||
| 
								 | 
							
								* `Chart.controllers.doughnut`
							 | 
						||
| 
								 | 
							
								* `Chart.controllers.polarArea`
							 | 
						||
| 
								 | 
							
								* `Chart.controllers.bubble`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For example, to derive a new chart type that extends from a bubble chart, you would do the following.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								// Sets the default config for 'derivedBubble' to be the same as the bubble defaults.
							 | 
						||
| 
								 | 
							
								// We look for the defaults by doing Chart.defaults[chartType]
							 | 
						||
| 
								 | 
							
								// It looks like a bug exists when the defaults don't exist
							 | 
						||
| 
								 | 
							
								Chart.defaults.derivedBubble = Chart.defaults.bubble;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// I think the recommend using Chart.controllers.bubble.extend({ extensions here });
							 | 
						||
| 
								 | 
							
								var custom = Chart.controllers.bubble.extend({
							 | 
						||
| 
								 | 
							
								    draw: function(ease) {
							 | 
						||
| 
								 | 
							
								        // Call super method first
							 | 
						||
| 
								 | 
							
								        Chart.controllers.bubble.prototype.draw.call(this, ease);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Now we can do some custom drawing for this dataset. Here we'll draw a red box around the first point in each dataset
							 | 
						||
| 
								 | 
							
								        var meta = this.getMeta();
							 | 
						||
| 
								 | 
							
								        var pt0 = meta.data[0];
							 | 
						||
| 
								 | 
							
								        var radius = pt0._view.radius;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var ctx = this.chart.chart.ctx;
							 | 
						||
| 
								 | 
							
								        ctx.save();
							 | 
						||
| 
								 | 
							
								        ctx.strokeStyle = 'red';
							 | 
						||
| 
								 | 
							
								        ctx.lineWidth = 1;
							 | 
						||
| 
								 | 
							
								        ctx.strokeRect(pt0._view.x - radius, pt0._view.y - radius, 2 * radius, 2 * radius);
							 | 
						||
| 
								 | 
							
								        ctx.restore();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Stores the controller so that the chart initialization routine can look it up with
							 | 
						||
| 
								 | 
							
								// Chart.controllers[type]
							 | 
						||
| 
								 | 
							
								Chart.controllers.derivedBubble = custom;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Now we can create and use our new chart type
							 | 
						||
| 
								 | 
							
								new Chart(ctx, {
							 | 
						||
| 
								 | 
							
								    type: 'derivedBubble',
							 | 
						||
| 
								 | 
							
								    data: data,
							 | 
						||
| 
								 | 
							
								    options: options
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Bar Controller
							 | 
						||
| 
								 | 
							
								The bar controller has a special property that you should be aware of. To correctly calculate the width of a bar, the controller must determine the number of datasets that map to bars. To do this, the bar controller attaches a property `bar` to the dataset during initialization. If you are creating a replacement or updated bar controller, you should do the same. This will ensure that charts with regular bars and your new derived bars will work seamlessly.
							 |