HTML:
<td mat-cell [attr.id]="hospital.organizational_id + '_hospitalname'"
*matCellDef="let hospital">
<div id="hospital_name" class="truncate"
[matTooltip]="hospital.organization_name.length > 32 ?
hospital.organization_name: '' ">
{{hospital.organization_name}}
</div>
</td>
CSS:
.truncate {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
display: block !important;
}
I want a tool-tip to be displayed dynamically purely depending on the ellipsis.But the problem is tool-tip displayed but it is also getting displayed for the data which doesn’t have ellipsis.I’m using angular-material
I have written some CSS after referring some sites
The expected behaviour is should get tool-tip only for the data which has ellipsis otherwise it should be hidden and u can see I’m using angular material.
I have seen some solutions with jquery and it doesn’t work for me. Is there a way to solve this?
Thanks in advance
Advertisement
Answer
Overflow of an element can be detected in JavaScript with this helper, using Angular ElementRef
and a formula from this answer:
function isTextTruncated(element: ElementRef): boolean {
const e = element.nativeElement;
return e.scrollWidth > e.clientWidth;
}
Then, in your component, use it referencing the element with a “@ViewChild
” property:
@ViewChild('hospitalName') hospitalNameElement: ElementRef;
isHospitalNameTruncated(): boolean {
return isTextTruncated(this.hospitalNameElement);
}
Finally, in the template, add the identifier #hospitalName
and call isHospitalNameTruncated()
to customize the tooltip text:
<td mat-cell [attr.id]="hospital.organizational_id + '_hospitalname'"
*matCellDef="let hospital">
<div id="hospital_name" #hospitalName class="truncate"
[matTooltip]="isHospitalNameTruncated() ? hospital.organization_name : null ">
{{hospital.organization_name}}
</div>
</td>