We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. (Last updated on: June 24, 2019).
Unfortunately, activation email could not send to your email. Please try again.
Syncfusion Feedback

Heatmap is not updated/re-rendered after datasource is changed

Thread ID:

Created:

Updated:

Platform:

Replies:

145063 Jun 4,2019 07:08 PM UTC Jun 12,2019 04:53 PM UTC Angular - EJ 2 3
loading
Tags: HeatMap
green lomu
Asked On June 4, 2019 07:08 PM UTC

Hi I'm trying to change the datasource of the heatmap control, but it is not re-rendering. Please advise.

//Component
import { Component, OnInit } from '@angular/core';
import { HeatMap } from '@syncfusion/ej2-heatmap';
import { DataAlertService } from 'src/app/_services/data-alert.service';
import { first } from 'rxjs/operators';
import { DataAlert } from 'src/app/_models/dataAlert';
import { interval } from 'rxjs';

import * as moment from 'moment';

@Component({
selector: 'heatmap',
templateUrl: './heatmap.component.html',
styleUrls: ['./heatmap.component.css']
})
export class HeatmapComponent implements OnInit {

dataSource: Object[] = [
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]
];

alerts: DataAlert[] = [];

height = '200';

parameters = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6'];
labels = [];
interval = 60;
slices:number = 5;
alertMatrix;
refreshTime = 5000;

xAxis: Object = {
labels: this.labels,
};
yAxis: Object = {
labels: this.parameters,
};

public cellSettings: Object = {
showLabel: false,
};

public paletteSettings: Object = {
palette: [{ value: 0, color: '#e6e6e6' },
{ value: 50, color: '#6C5B7B' },
{ value: 100, color: '#ff0000' },
]
};

constructor(private dataAlertService: DataAlertService) {

}

public ngOnInit() {

//set the labels
var now = moment();
var labelTick;
for (var i = 0; i< (this.interval / this.slices); i++) {
labelTick = moment(now).subtract(this.interval, 'minutes').add(i * this.slices, 'minutes').format('hh:mm')
this.labels.push(labelTick);
}

//create a matrix parameters x (interval / slices)
this.alertMatrix = Array(this.interval / this.slices).fill(0).map(() => Array(this.parameters.length).fill(0));
//this.alertMatrix = Array(this.parameters.length).fill(0).map(() => Array(this.interval / this.slices).fill(0));
console.log(this.alertMatrix);

//get all alerts within a certain interval
this.dataAlertService.getAllAlertsByInterval(this.interval).subscribe(
data => {
this.alerts = data;
this.slices;
},
error => console.error(error),
() => {
console.log("observable complete");
this.categorize();
}
);

//refresh the view if refreshTime is set
if (this.refreshTime != 0) {
interval(this.refreshTime).subscribe(() => {
this.dataAlertService.getAllAlertsByInterval(this.interval).pipe(first()).subscribe(
data => {
this.alerts = data;
},
error => console.error(error),
() => {
console.log("observable complete");
this.categorize();
}
);
});
}
}

private categorize() {
console.log("categorize accessed");

let bucketIndex;
let buckets = (this.interval / this.slices) - 1;
var now = moment();
for (var i = 0; i < this.alerts.length; i++) {
var createdMin = moment(this.alerts[i]['created']).format("mm");
var duration = moment.duration(now.diff(moment(this.alerts[i]['created'])));

bucketIndex = Math.trunc(duration.asMinutes() / this.slices);
console.log('durcation: ' + duration.asMinutes());
console.log('bucketIndex: ' + bucketIndex)

//find the index of the parameter
var foundIndex = this.parameters.findIndex(x => x == this.alerts[i]['parameter'])
console.log('foundIndex' + foundIndex);

//increment if index could be found
if (foundIndex != -1 && this.alertMatrix[buckets - bucketIndex][foundIndex] < 100) {
this.alertMatrix[buckets - bucketIndex][foundIndex] = 100;
}
}

this.dataSource = this.alertMatrix;
this.xAxis = { labels: this.labels }
console.log(this.dataSource);
}

}

//View

<div class="card">

<div class="card-header">
Alerts
</div>

<div class="card-body">
<ejs-heatmap id='container' style="display:block;" [dataSource]='dataSource' [xAxis]='xAxis' [yAxis]='yAxis'
[cellSettings]='cellSettings' [paletteSettings]='paletteSettings' [height]='height'>
</ejs-heatmap>
</div>

</div>

Pooja Priya Krishna Moorthy [Syncfusion]
Replied On June 5, 2019 02:32 PM UTC

Hi Green, 
  
Greetings from Syncfusion support. 
 
To update the data source we can directly assign the data to the dataSource property. From the code snippet shared by you we found that categorize method is called for every 5 seconds as you set the  ‘refreshTime’ value as 5000. We need to skip this process while dynamically changing data source. Please find the code example below. 
  
  
private categorize() 
        { 
            if (!this.clearTime) 
            { 
                //... 
            } 
        } 
changeData() : void { 
            this.clearTime = true; 
            this.dataSource = [ 
                [100, 90, 80, 70, 60, 30], 
                //... 
            ] 
        } 
  
Please find the below sample link. 
 
Please get back to us if you require further assistance on this. 
  
Regards, 
Pooja Priya K 
 


green lomu
Replied On June 11, 2019 03:06 PM UTC

Hi Pooja - 

thanks for working on this. 

Unfortunately - So far I could not understand your suggested solution and wasn't able to apply it. 

Is there any documentation about the changeData method? Is this a function that is called by the component? It seems as if it not accessed at all. 

Thanks for providing an answer. 

Kind Regards - 
Green

Pooja Priya Krishna Moorthy [Syncfusion]
Replied On June 12, 2019 04:53 PM UTC

Hi Green, 
 
changeData is not a public method of Heatmap component. This is the method bound to the onclick event of button element. On button click action, updated data can be directly bound to the dataSource property of Heatmap component. When updated data is set to the dataSource property, heatmap is refreshed based on updated data. Please find the code example below. 
 
[HTML] 
<button (click)="changeData()"> change</button> 
 
[TS] 
changeData(): void { 
            this.clearTime = true; 
            this.dataSource = [ 
                [100, 90, 80, 70, 60, 30], 
                [0, 0, 0, 0, 0, 0], 
                [0, 0, 0, 0, 0, 0], 
            ] 
    } 
 
Please get back to us if you require further assistance on this. 
 
Regards, 
Pooja Priya K 
 


CONFIRMATION

This post will be permanently deleted. Are you sure you want to continue?

Sorry, An error occured while processing your request. Please try again later.

Please sign in to access our forum

This page will automatically be redirected to the sign-in page in 10 seconds.

Warning Icon You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.Close Icon

Live Chat Icon For mobile
Live Chat Icon