angular материал: MatTableDataSource sort.sortChange вызывает неверное состояние сортировки при загрузке данных - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть компонент, который наблюдает за потоком данных и фильтрует его. Этим отфильтрованным данным присваивается атрибут data для MatTableDataSource, называемый this.filteredData, который используется в качестве ввода для MatTable компонента. Данные обновляются от родительского компонента, и изменения обнаруживаются следующим образом:

/** `this.dataSource` in this case is another MatTableDataSource */
this.dataSource.connect().subscribe( () => {  
    this.filterData(); // sets the value of this.filteredData.data
} );

У меня есть сортировка, фильтрация и т. Д. c. Настроить на таблице отлично, и он без проблем подписывается на обновления.

@ViewChild (MatSort ...)... в компоненте обеспечивает this.sort, который используется как атрибут sort *1013*.

У меня есть @Output от компонента, который выдает текущее Sort состояние таблицы, т. Е. Если пользователь нажимает на столбец и меняет сортировку, используя

this.filteredDataSource.sort.sortChange.subscribe( sort => {
    this.sortChanged.emit( sort );
} );

в компоненте ngAfterViewInit().

Цель состоит в том, чтобы параметры сортировки могли быть переданы в компонент вне.

Вот одна ошибка с этим подходом, которую я не могу решить:

Когда this.filteredData.data обновляется после инициализации, this.sort испускает sortChange для состояния сортировки, которого у него нет (кажется, направление asc в первом столбце / атрибуте). Родительский компонент получает это неправильное состояние, что означает, что если он будет сохранен и использован позже, он будет некорректным. Это sortChange отправляется даже после того, как правильно сохраненное состояние Sort применяется к this.filteredData после его обновления, если я не использую какое-то время ожидания, которое кажется случайным.

Имитация потока:

this.filteredDataSource.data = this.dataSource.data.concat();
this.filterForms.forEach( filterForm => {
   ... //(apply filtering based on the form's selection)
   this.filteredDataSource.data = this.filteredDataSource.data.filter(...)
} );
const sort = ( { id: `date`, start: `desc` } ) as MatSortable;
this.sort.sort( sort );

Генератор событий sortChange затем излучает:

-> {active: "date", direction: "desc"}
-> {active: "id", direction: "asc"}

(в данном случае id - первый столбец таблицы)

Там в коде нет ничего, что могло бы испустить эту секунду sortChange. Angular испускает это, потому что загружает строку заголовка или что-то? Я не смог решить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...