Calling a directive after the load of last item in ngFor

允我心安 提交于 2019-12-08 02:54:00

问题


I have a component which contains a table, I call ngFor on a row inside the tBody, the problem is that I need the directive that I apply on the Table to be run after loading the last element of ngFor.

Here is my component

import {Component} from 'angular2/core';
import {InfScrollTableService} from './inf-scroll-table.service'
import {HTTP_PROVIDERS} from 'angular2/http';
import {InfScrollTableDirective} from './inf-scroll-table.directive'
@Component({
  selector: 'my-app',
  template: `
   <table class="scrollable" infScrollTable>
     <thead>
       <tr>
         <th class="small-cell">Code</th>
         <th>Label</th>
         <th>Area</th>
       </tr>
     </thead>
     <tbody>
       <tr  *ngFor="#country of countries; #last=last" *ngIf="last">
         <td class="small-cell">{{country.id}}</td>
         <td><a href="#" >{{country.id}}</a></td>
         <td>{{last}}</td>
       </tr>
     </tbody>
   </table>
`,
providers: [InfScrollTableService, HTTP_PROVIDERS],
directives: [InfScrollTableDirective]
})

export class AppComponent {
  public countries;
  constructor(private _infScrollTableService: InfScrollTableService){
    this._infScrollTableService.getCountries()
    .subscribe(
      data => {
        console.log(data);
        this.countries=data;
      });
  }
}

My Directive:

import {Directive, ElementRef} from 'angular2/core'

@Directive({
  selector: '[infScrollTable]',
})

export class InfScrollTableDirective{
   private _elem:HTMLTableElement;

   constructor(el: ElementRef) { this._elem = el.nativeElement; console.log(el)}
   bord(last:boolean){
    if(!last){
      return
    }
    console.log(this._elem)
    var th = this._elem.tHead.rows[this._elem.tHead.rows.length - 1].cells;
    var td = this._elem.tBodies[0].rows[0].cells;
    var tdLen = td.length - 1;
    var j = 0;
    for (; j < tdLen; j++) {
      if (th[j].offsetWidth > td[j].offsetWidth) {
        td[j].style.width = th[j].offsetWidth + 'px';
        th[j].style.width = th[j].offsetWidth + 'px';
      } else {
        th[j].style.width = td[j].offsetWidth + 'px';
        td[j].style.width = td[j].offsetWidth + 'px';
      }
    }
  }
}

Here, I tried multiple stuff the last of which made the most sense where I passed the "last" in the ngIf to a function but when I logged the received value on the console it was undefined

in angular 1 I achieved what I wanted using

$scope.$on('LastElem', function(){...})

回答1:


An approach would be to apply a directive to all rows and pass last. Where last is true the directive actually does something.

@Directive({selector: '[isLast]'})
export class LastDirective{
   @Input() isLast:boolean;
   @Output() lastDone:EventEmitter<boolean> = new EventEmitter<boolean>();
   ngOnInit() {
     if(this.isLast) {
       this.lastDone.emit(true);
     }
   }
}
<tr  *ngFor="let country of countries; let last=last" [isLast]="last" (lastDone)="doSomething()">

You could also create a custom ngFor that provides additional features.



来源:https://stackoverflow.com/questions/36750678/calling-a-directive-after-the-load-of-last-item-in-ngfor

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!