Search results

Data Binding

  • Diagram can be populated with the nodes and connectors based on the information provided from an external data source.

  • Diagram exposes its specific data-related properties allowing you to specify the data source fields from where the node information has to be retrieved from.

  • The dataManager property is used to define the data source either as a collection of objects or as an instance of DataManager that needs to be populated in the diagram.

  • The ID property is used to define the unique field of each JSON data.

  • The parentId property is used to defines the parent field which builds the relationship between ID and parent field.

  • The root property is used to define the root node for the diagram populated from the data source.

  • To explore those properties, see DataSourceSettings.

  • Diagram supports two types of data binding. They are:

    1. Local data
    2. Remote data

Local data

Diagram can be populated based on the user defined JSON data (Local Data) by mapping the relevant data source fields.

To map the user defined JSON data with diagram, configure the fields of dataSourceSettings. The following code example illustrates how to bind local data with the diagram.

Source
Preview
app.vue
<template>
    <div id="app">
        <ejs-diagram id="diagram" :width='width' :height='height' :tool='tool' :getNodeDefaults='getNodeDefaults' :snapSettings='snapSettings' :getConnectorDefaults='getConnectorDefaults' :layout='layout' :dataSourceSettings='dataSourceSettings' ></ejs-diagram>
    </div>
</template>
<script>
    import Vue from 'vue';
    import { DiagramPlugin,Diagram, HierarchicalTree, DataBinding,DiagramTools,NodeModel } from '@syncfusion/ej2-vue-diagrams';
    import { DataManager } from "@syncfusion/ej2-data";
    Vue.use(DiagramPlugin);
    Diagram.Inject(DataBinding, HierarchicalTree);

    export let species = [{
        'Name': 'Species',
        'fillColor': '#3DD94A'
    },
    {
        'Name': 'Plants',
        'Category': 'Species'
    },
    {
        'Name': 'Fungi',
        'Category': 'Species'
    },
    {
        'Name': 'Lichens',
        'Category': 'Species'
    },
    {
        'Name': 'Animals',
        'Category': 'Species'
    },
    {
        'Name': 'Mosses',
        'Category': 'Plants'
    },
    {
        'Name': 'Ferns',
        'Category': 'Plants'
    },
    {
        'Name': 'Gymnosperms',
        'Category': 'Plants'
    },
    {
        'Name': 'Dicotyledens',
        'Category': 'Plants'
    },
    {
        'Name': 'Monocotyledens',
        'Category': 'Plants'
    },
    {
        'Name': 'Invertebrates',
        'Category': 'Animals'
    },
    {
        'Name': 'Vertebrates',
        'Category': 'Animals'
    },
    {
        'Name': 'Insects',
        'Category': 'Invertebrates'
    },
    {
        'Name': 'Molluscs',
        'Category': 'Invertebrates'
    },
    {
        'Name': 'Crustaceans',
        'Category': 'Invertebrates'
    },
    {
        'Name': 'Others',
        'Category': 'Invertebrates'
    },
    {
        'Name': 'Fish',
        'Category': 'Vertebrates'
    },
    {
        'Name': 'Amphibians',
        'Category': 'Vertebrates'
    },
    {
        'Name': 'Reptiles',
        'Category': 'Vertebrates'
    },
    {
        'Name': 'Birds',
        'Category': 'Vertebrates'
    },
    {
        'Name': 'Mammals',
        'Category': 'Vertebrates'
    }
];
export default {
    name: 'app',
    data() {
        return {
            width: "100%",
            height: "350px",
            getNodeDefaults: (obj) => {
                //Initialize shape
                obj.shape = {
                    type: 'Basic',
                    shape: 'Rectangle'
                };
                obj.style = {
                    strokeWidth: 1
                };
                obj.width = 95;
                obj.height = 30;
            },
            getConnectorDefaults: (connector) => {
                connector.type = 'Orthogonal';
                connector.style.strokeColor = '#4d4d4d';
                connector.targetDecorator.shape = 'None';
            },
            snapSettings: {
                constraints: 0
            },
            tool: DiagramTools.ZoomPan,
            layout: {
                type: 'HierarchicalTree',
                horizontalSpacing: 15,
                verticalSpacing: 50,
                margin: {
                    top: 10,
                    left: 10,
                    right: 10,
                    bottom: 0
                },
            },
            dataSourceSettings: {
                id: 'Name',
                parentId: 'Category',
                dataManager: new DataManager(species),
                //binds the external data with node
                doBinding: (nodeModel: NodeModel, data: DataInfo, diagram: Diagram) => {
                    nodeModel.annotations = [{
                        /* tslint:disable:no-string-literal */
                        content: data['Name'],
                        margin: {
                            top: 10,
                            left: 10,
                            right: 10,
                            bottom: 0
                        },
                        style: {
                            color: 'black'
                        }
                    }];
                    /* tslint:disable:no-string-literal */
                    nodeModel.style = {
                        fill: '#ffeec7',
                        strokeColor: '#f5d897',
                        strokeWidth: 1
                    };
                }
            },
        }
    },
    provide: {
        diagram: [DataBinding, HierarchicalTree]
    },
}
</script>
<style>
    @import "../../node_modules/@syncfusion/ej2-vue-diagrams/styles/material.css";
</style>

Remote data

You can bind the diagram with remote data by using [dataManager].

It uses two different classes: DataManager for processing and Query for serving data. DataManager communicates with data source and Query generates data queries that are read by the dataManager.

To learn more about data manager, refer to Data Manager.

To bind remote data to the diagram,configure the fields of dataSourceSettings. The following code illustrates how to bind remote data to the diagram.

Source
Preview
app.vue
<template>
    <div id="app">
        <ejs-diagram id="diagram" :width='width' :height='height' :tool='tool' :getNodeDefaults='getNodeDefaults' :snapSettings='snapSettings' :getConnectorDefaults='getConnectorDefaults' :layout='layout' :dataSourceSettings='dataSourceSettings' ></ejs-diagram>
    </div>
</template>
<script>
    import Vue from 'vue';
    import { DiagramPlugin, Diagram,HierarchicalTree, DataBinding,DiagramTools,NodeModel } from '@syncfusion/ej2-vue-diagrams';
    import { DataManager,Query } from "@syncfusion/ej2-data";
    Vue.use(DiagramPlugin);
    Diagram.Inject(DataBinding, HierarchicalTree);

export default {
    name: 'app',
    data() {
        return {
            width: "100%",
            height: "350px",
           layout: {
        type: 'HierarchicalTree', margin: { left: 0, right: 0, top: 100, bottom: 0 },
        verticalSpacing: 40,
        getLayoutInfo: (node: Node, options: TreeInfo) => {
            if (options.level === 3) {
                node.style.fill = '#3c418d';
            }
            if (options.level === 2) {
                node.style.fill = '#108d8d';
                options.type = 'Center';
                options.orientation = 'Horizontal';
            }
            if (options.level === 1) {
                node.style.fill = '#822b86';
            }
        }
    },
    //Sets the default values of nodes
    getNodeDefaults: (obj: Node) => {
        obj.width = 80;
        obj.height = 40;
        //Initialize shape
        obj.shape = { type: 'Basic', shape: 'Rectangle' };
        obj.style = { fill: '#048785', strokeColor: 'Transparent' };
    },
    //Sets the default values of connector
    getConnectorDefaults: (connector: Connector) => {
        connector.type = 'Orthogonal';
        connector.style.strokeColor = '#048785';
        connector.targetDecorator.shape = 'None';
    },
    dataSourceSettings: {
        id: 'EmployeeID', parentId: 'ReportsTo',
        dataManager: new DataManager(
            { url: 'http://mvc.syncfusion.com/Services/Northwnd.svc/', crossDomain: true },
            new Query().from('Employees').select('EmployeeID,ReportsTo,FirstName').take(9),
        ),
        //binds the external data with node
        doBinding: (nodeModel: NodeModel, data: DataInfo, diagram: Diagram) => {
            nodeModel.annotations = [{
                /* tslint:disable:no-string-literal */
                content: data['FirstName'],
                style: { color: 'white' }
            }];
        }
    },
    //Disables all interactions except zoom/pan
    tool: DiagramTools.ZoomPan,
    snapSettings: { constraints: 0 }
    provide: {
        diagram: [DataBinding, HierarchicalTree]
    },
}
</script>
<style>
    @import "../../node_modules/@syncfusion/ej2-vue-diagrams/styles/material.css";
</style>

See Also