рдореИрдВ рдПрдХ рд╕рдВрдЧрдарди рдЪрд╛рд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ReactJS, d3JS рдФрд░ ES6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЪрд╛рд░реНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдЬрд╝реВрдо рдФрд░ рдбреНрд░реИрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ d3.behavior.zoom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╝реВрдо рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдХрд╣рд▓рд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди d3.event рд╢реВрдиреНрдп рд╣реИред
рдореИрдВрдиреЗ рдЬрд╝реВрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ div, svg рдФрд░ g рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрд╝реВрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдШрдЯрдирд╛ рд╢реВрдиреНрдп рд╣реИред
рдореЗрд░реЗ ASP.NET рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореИрдВрдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ systemJS рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ d3.js рдХрд╛ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ d3.event рд╢реВрдиреНрдп рдХреНрдпреЛрдВ рд╣реИ, рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХрдИ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдЙрддреНрддрд░ рд╣реИрдВред
рдореЗрд░рд╛ рдХреЛрдб рдЗрд╕ https://github.com/Swizec/candidate-bucket-chart/blob/169779e110c8825f4545c71ae5845ff7bad4f1f4/src/BubbleChart.jsx рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ ReactJS рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдордЬреЗрдПрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ:
<script>
System.defaultJSExtensions = true;
System.config({
map: {
'rx': "https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.min.js",
'react': 'https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react.js',
'react-dom': 'https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react-dom.js',
'd3': 'https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.16/d3.js'
}
});
System.import('../app/app.js');
</script>
import React, { Component } from 'react';
import * as Rx from 'rx';
import * as d3 from 'd3';
import Person from './person';
class OrgChart extends Component {
constructor(props) {
super(props);
this.state = { persons: [] };
}
componentWillMount() {
// Just read a JSON file
var source = Rx.Observable.fromPromise($.getJSON("/js/org-persons.json"));
source.subscribe(
function(chart) {
var tree = d3.layout.tree()
.nodeSize([110, 50])
.separation(function() {
return 1;
});
var nodes = tree.nodes(chart[0]).reverse();
var links = tree.links(nodes);
var p = [];
nodes.forEach(function(node) {
fs.push((<Person x={node.x} y={node.y}></Person>));
}.bind(this));
this.setState({ person: p });
}.bind(this)
);
}
componentDidMount() {
var rootX = document.body.clientWidth / 4;
var rootY = 300;
// A standard setup with d3 to use it's zoom/drag behavior
var zoom = d3.behavior.zoom()
.scaleExtent([1, 10])
.on("zoom", this.zoomed)
.translate([rootX, rootY]);
// Attach zoom behavior to the first group in the svg.
d3.select("#viewport")
.call(zoom);
}
// When I drag the svg, this function gets called but the event is null. d3 is a global object.
zoomed() {
d3.select("#viewport").attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
}
// renders an org chart
render() {
return (
<div id='treeContainer'><svg id='fullTree' width='100%'>
<g id='viewport'>
{ this.state.persons }
</g>
</svg></div>
);
}
}
export default OrgChart;
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдп d3 рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдИрд╡реЗрдВрдЯ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдИрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ d3 рдкреНрд░рд╢реНрди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рдПрдХ рдФрд░ рдиреЛрдЯ рдкрд░, рдЖрдкрдХреЛ рдПрдХ рдбреЛрдо рдиреЛрдб рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ref
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред d3.select("#viewport")
рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдЖрдИрдбреА рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдПрдХ рдШрдЯрдХ рдХреЛ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ref
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрди рдореБрджреНрджреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдореБрджреНрджреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
> window.theD3versionHostingTheEvent = d3;
listener.apply(this, argumentz);
рддрдХ рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдФрд░ рддрдм рддрдХ рд╕реНрдЯреЗрдк рдЗрди рдиреЗрдХреНрд╕реНрдЯ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдЪреБрдиреЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдПрд░рд░ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗредwindow.theD3versionHostingTheEvent == d3
рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо false
, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ d3 рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрди рдХрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рдХрд▓рд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ d3 рдмрдВрдбрд▓ рдерд╛ред
рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ d3 рд╕реЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИред
рдЗрд╕реЗ рджреЗрдЦреЗрдВ: https://github.com/d3/d3/issues/2733#issuecomment -190743489
рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде d3 рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:
import * as d3 from 'd3';
import {event as currentEvent} from 'd3';
рдФрд░ рдХреЗ рд╕рднреА рдЖрд╡реГрддреНрддрд┐рдпрд╛рдВ рдХреА рдЬрдЧрд╣ d3.event
рдХреЗ рд╕рд╛рде currentEvent
ред
рдпрд╣ d3.js v3 рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ d3 рд╕реЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИред
рдЗрд╕реЗ рджреЗрдЦреЗрдВ: https://github.com/d3/d3/issues/2733#issuecomment -190743489
рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде d3 рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:
рдФрд░ рдХреЗ рд╕рднреА рдЖрд╡реГрддреНрддрд┐рдпрд╛рдВ рдХреА рдЬрдЧрд╣
d3.event
рдХреЗ рд╕рд╛рдеcurrentEvent
редрдпрд╣ d3.js v3 рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред