Попробуйте использовать ChangeDetectionStrategy.OnPush
и last
переменную ngFor
. Поскольку ChangeDetectionStrategy.Default
всегда проверяет методы, поэтому fooMethod(...)
будет вызываться из нескольких элементов:
<div *ngFor = "let title of iterated; let i=index; let last=last">
{{last ? fooMethod(last) : '' }}
</div>
yourComponent.ts:
import { Component, ChangeDetectionStrategy } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AppComponent {
name = 'Angular 4';
iteratedData = [
{"title":"test1","description":"foo","name":"name1"},
{"title":"test2","description":"foo","name":"name2"},
{"title":"test3","description":"foo","name":"name3"},
{"title":"test4","description":"foo","name":"name4"}
];
fooMethod(v) {
if (v)
console.log(`This is from the method ${v}`);
}
}
ОБНОВЛЕНИЕ:
После того, как выЗагрузив данные, вы должны вызвать метод среза, так как стратегия обнаружения изменений Angular 2 не проверяет содержимое массивов или объектов. Поэтому попробуйте создать копию массива после мутации:
this.iteratedData.push(newItem);
this.iteratedData = this.iteratedData.slice();
ИЛИ:
constructor(private changeDetectorRef: ChangeDetectorRef)
И вы можете вызвать метод markForCheck
, чтобы вызвать changeDetection
:
this.iteratedData.push(newItem);
this.changeDetectorRef.markForCheck();