I have a set of data called reports which contain an array of networks (report.networks). I have model.ts to manipulate the networks array before i return it back. I do an ngFor to iterate over the network data to display the details which works fine. However, adding a matToolTips within the ngFor does not get displayed.
component.html
<span matTooltip="Tooltip Works">Tooltip Works</span>
<div *ngFor="let network of report.networks">
   <span matTooltip="Tooltip Does NOT work!">Tooltip Does NOT work</span>
</div>
component.ts
import { Report } from './../../core/models/report/report.model';
@Component({
    selector: 'app-report-detail',
    templateUrl: './report-detail.component.html',
    styleUrls: ['./report-detail.component.scss']
})
export class ReportDetailComponent implements OnInit {
    report: Report;
    constructor(private route: ActivatedRoute) { }
    ngOnInit() {
        this.report = this.route.snapshot.data.report;
        console.log(this.report);
    }
}
report.model.ts
export class Report {
    networks?: any = null;
    constructor(data?: Report) {
        if (data) {
            this.deserialize(data);
        }
    }
    private deserialize(data: Report) {
        const keys = Object.keys(this);
        for (const key of keys) {
            if (data.hasOwnProperty(key)) {
                this[key] = data[key];
            }
        }
    }
    get networks() {
        let n = this.networks;
        //some manipulation
        return n
    }
}
                As mentioned here https://github.com/angular/material2/issues/10039
The array is instance being created over and over again when using a function in a ngFor which causes multiple issues like matToolTip not displaying as-well as performance issues.
Another way i got around this is to change my model.ts file. So below im assigning a variable to the result of the function. Then i use this variable inside the ngFor isntead of the function directly.
export class Report {
    networks?: any = null;
    //custom
    customNetworks? : any = null;
    constructor(data?: Report) {
        if (data) {
            this.deserialize(data);
            this.customNetworks = this.generateNetworks()
        }
    }
    private deserialize(data: Report) {
        const keys = Object.keys(this);
        for (const key of keys) {
            if (data.hasOwnProperty(key)) {
                this[key] = data[key];
            }
        }
    }
    generateNetworks() {
        let n = this.networks;
        //some manipulation
        return n
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With