Хитрый. Вам нужно инициализировать выделение путем извлечения этого конкретного объекта PeriodicElement из вашего ввода данных dataSource и передачи it в конструктор.
В этом конкретном случае вы могли бы кодировать
selection = new SelectionModel<PeriodicElement>(true, [this.dataSource.data[1]);
Это из-за того, что SelectionModel проверяет активные выборы.
В вашей разметке таблицы есть
<mat-checkbox ... [checked]="selection.isSelected(row)"></mat-checkbox>
Вы ожидаете, что эта привязка пометит соответствующую строку как отмеченную. Но метод isSelected (row) не распознает переданный здесь объект как выбранный, потому что это не тот объект, который вы выбрали в своем конструкторе.
«строка» указывает на объект из фактического ввода MatTableDataSource:
dataSource = new MatTableDataSource<PeriodicElement>(ELEMENT_DATA);
Но инициализация выбора:
selection = new SelectionModel<PeriodicElement>(true, [{position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}]);
происходит с новым объектом, который вы создаете на лету. Ваш выбор запоминает ЭТОТ объект как выбранный.
Когда angular оценивает привязки в разметке, SelectionModel внутренне проверяет идентичность объекта. Он будет искать объект, на который указывает «строка» во внутреннем наборе выбранных объектов.
Сравните со строками 99-101 и 16 из SelectionModel исходный код:
isSelected(value: T): boolean {
return this._selection.has(value);
}
и
private _selection = new Set<T>();