Вам необходимо взять ссылку на значение, полученное из наблюдаемого, с помощью оператора as. Затем вы можете передать его в функцию сортировки.
<ng-container *ngIf="rallies$ | async as rallies">
<div>
<button (click)="sortByDate(rallies)">
Sort by date
</button>
</div>
<div *ngFor="let rally of rallies">
<img src="{{ rally.icon }}" />
</div>
</ng-container>
и заставить функцию сортировки принимать переменную шаблона в качестве параметра.
sortByDate = rallies => rallies.sort((a, b) => a.date - b.date);
Проблема с этим решением состоит в том, что вымутирует митинги, которые испускаются митингами $ наблюдаемыми. Я использую трубу клонирования, которая клонирует испускаемое значение перед присвоением переменной шаблона.
*ngIf="rallies$ | async | clone as rallies"
Таким образом, функция сортировки не вызывает никаких побочных эффектов.
import { Pipe, PipeTransform } from '@angular/core';
import { clone } from './clone';
@Pipe({
name: 'clone'
})
export class ClonePipe implements PipeTransform {
transform(value: any): any {
return clone(value);
}
}
и клонfunction
export const clone = (obj: any) =>
Array.isArray(obj)
? obj.map(item => clone(item))
: obj instanceof Date
? new Date(obj.getTime())
: obj && typeof obj === 'object'
? Object.getOwnPropertyNames(obj).reduce((o, prop) => {
o[prop] = clone(obj[prop]);
return o;
}, {})
: obj;
Клонирование означает, что у нас не было побочных эффектов с другими компонентами, которые могут использовать данные из митингов $ observable.