Skip to content
This repository was archived by the owner on Feb 2, 2025. It is now read-only.

Commit f5790fc

Browse files
committed
fix: migrate Router link example to TemplateRef
1 parent 4e03350 commit f5790fc

File tree

4 files changed

+56
-25
lines changed

4 files changed

+56
-25
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<div class="btn-group d-block text-center">
2-
<button class="btn btn-sm btn-dark" (click)="onAction1()">Action 1</button>
2+
<button class="btn btn-sm btn-dark" (click)="onAction1()">{{actionText}}</button>
33
</div>

demo/src/app/advanced/demo-ng-template-ref.component.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ export class DemoNgComponent implements OnInit {
1616
@Input()
1717
data = {};
1818

19+
@Input()
20+
actionText = 'Action 1';
21+
1922
ngOnInit(): void {
2023
}
2124

demo/src/app/advanced/router-link.component.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
<ng-template #preview>
2-
<table datatable [dtOptions]="dtOptions" class="row-border hover"></table>
2+
<table datatable [dtOptions]="dtOptions" [dtTrigger]="dtTrigger" class="row-border hover"></table>
33
</ng-template>
4+
5+
<ng-template #demoNg let-data="adtData" let-emitter="captureEvents">
6+
<app-demo-ng-template-ref [data]="data" actionText="View" (emitter)="emitter($event)"></app-demo-ng-template-ref>
7+
</ng-template>
8+
49
<app-base-demo [pageTitle]="pageTitle" [mdIntro]="mdIntro" [mdHTML]="mdHTML"
510
[mdTS]="mdTS" [mdTSHeading]="mdTSHeading" [mdTSHigh]="mdTSHigh" [mdTSHighHeading]="mdTSHighHeading"
611
[template]="preview">
Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
import { AfterViewInit, Component, OnInit, Renderer2 } from '@angular/core';
1+
import { AfterViewInit, Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
22
import { Router } from '@angular/router';
3+
import { ADTSettings } from 'angular-datatables/src/models/settings';
4+
import { Subject } from 'rxjs';
5+
import { IDemoNgComponentEventType } from './demo-ng-template-ref-event-type';
6+
import { DemoNgComponent } from './demo-ng-template-ref.component';
37

48
@Component({
59
selector: 'app-router-link',
@@ -15,36 +19,55 @@ export class RouterLinkComponent implements AfterViewInit, OnInit {
1519
mdTSHeading = 'TypeScript (Angular v9 and below)';
1620
mdTSHighHeading = 'TypeScript (Angular v10 and above)';
1721

18-
dtOptions: DataTables.Settings = {};
22+
dtOptions: ADTSettings = {};
23+
dtTrigger = new Subject<ADTSettings>();
1924

20-
constructor(private renderer: Renderer2, private router: Router) { }
25+
@ViewChild('demoNg') demoNg: TemplateRef<DemoNgComponent>;
26+
27+
constructor(
28+
private router: Router
29+
) { }
2130

2231
ngOnInit(): void {
32+
}
33+
34+
ngAfterViewInit() {
35+
const self = this;
36+
// init here as we use ViewChild ref
2337
this.dtOptions = {
2438
ajax: 'data/data.json',
25-
columns: [{
26-
title: 'ID',
27-
data: 'id'
28-
}, {
29-
title: 'First name',
30-
data: 'firstName'
31-
}, {
32-
title: 'Last name',
33-
data: 'lastName'
34-
}, {
35-
title: 'Action',
36-
render: function (data: any, type: any, full: any) {
37-
return '<button class="waves-effect btn" view-person-id="' + full.id + '">View</button>';
39+
columns: [
40+
{
41+
title: 'ID',
42+
data: 'id'
43+
}, {
44+
title: 'First name',
45+
data: 'firstName'
46+
}, {
47+
title: 'Last name',
48+
data: 'lastName'
49+
},
50+
{
51+
title: 'Action',
52+
defaultContent: '',
53+
ngTemplateRef: {
54+
ref: this.demoNg,
55+
context: {
56+
// needed for capturing events inside <ng-template>
57+
captureEvents: self.onCaptureEvent.bind(self)
58+
}
59+
}
3860
}
39-
}]
61+
]
4062
};
63+
64+
// race condition fails unit tests if dtOptions isn't sent with dtTrigger
65+
setTimeout(() => {
66+
this.dtTrigger.next(this.dtOptions);
67+
}, 200);
4168
}
4269

43-
ngAfterViewInit(): void {
44-
this.renderer.listen('document', 'click', (event) => {
45-
if (event.target.hasAttribute("view-person-id")) {
46-
this.router.navigate(["/person/" + event.target.getAttribute("view-person-id")]);
47-
}
48-
});
70+
onCaptureEvent(event: IDemoNgComponentEventType) {
71+
this.router.navigate(["/person/" + event.data.id]);
4972
}
5073
}

0 commit comments

Comments
 (0)