1- import { AfterViewInit , Component , OnInit , Renderer2 } from '@angular/core' ;
1+ import { AfterViewInit , Component , OnInit , TemplateRef , ViewChild } from '@angular/core' ;
22import { 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