Как реализовать выделение всех элементов дерева с помощью selectionmodel?

#angular #typescript #tree #selectall

#angular #typescript #дерево #selectall

Вопрос:

У меня есть дерево с выбором элементов. Я организовал событие изменения списка выбора следующим образом.

 checklistSelection = new SelectionModel<TodoItemFlatNode>(true);
this.checklistSelection.changed.subscribe(data => {
  this.selectedEmit.emit(this.checklistSelection.selected.map(s => s.item));
});
 

Ранее пользователь мог выбирать элементы дерева только щелчком мыши. И все было хорошо.
Теперь я добавил кнопку «выбрать все».

 public SelectAllNode(): void {
 this.checklistSelection.clear();
 if (this.isCheckedAllNode) {
   for (let dataNode of this.treeControl.dataNodes) {
     this.checklistSelection.select(dataNode);
   }
 } else {
   for (let dataNode of this.treeControl.dataNodes) {
     this.checklistSelection.deselect(dataNode);
   }
 }
}
 

В моем дереве более 3000 элементов. Когда пользователь нажимает эту кнопку, происходит 3000 событий — очень непрактично. Подскажите, пожалуйста, как лучше организовать выделение всех элементов? Например, отписаться от события, а в конце подписаться на него снова?

Ответ №1:

Кажется, проблема исчезла, когда я это сделал:

 public SelectAllNode(): void {
  this.checklistSelection.clear();
  if (this.isCheckedAllNode) {
    this.checklistSelection.select(...this.treeControl.dataNodes);
  } else {
    this.checklistSelection.deselect(...this.treeControl.dataNodes);
  }
}
 

Но я не знаю, насколько это хорошо.