у меня есть родительский компонент: родительский список содержит два дочерних компонента (список первого дочернего элемента, список второго дочернего элемента)
во втором компоненте дочернего списка: у меня есть таблица mat, которая получает данные для отображения в качестве входных данных, поэтому я создаю источник данных в ng OnChanges с экземпляром источника данных таблицы Mat), я использую модель выбора для обработки выбора row (iuse isAllSelected и основные методы Toggle).
Мне нужно передать выбранные строки первому дочернему компоненту, я использую сервис, который содержит субъект поведения, поэтому я затем перехожу к данным, используя методы набора данных.
в первом дочернем компоненте я использую массив форм внутри таблицы матов и обрабатываю выбор, делаю консольный журнал источника данных (вы видите в консоли, что когда я играю с выбором одного, многих или всех во втором компоненте списка, я есть цикл в консоли, и требуется время, чтобы выбрать все или один из второго компонента списка, может быть потому, что я создаю таблицу внутри методов подписки)
вы можете найти мой stack-blitz, содержащий код здесь,
попробуйте поиграть с select, и мы увидим, что это занимает некоторое время и повторяется столько раз в консоли.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У вас есть метод this.setData() в isAllSelected(). Это приводит к многократному выполнению .next вашего объекта.
isAllSelected() срабатывает при каждом обнаружении изменений несколько раз в вашем шаблоне.
[checked] = "selection.hasValue() && isAllSelected()"
[indeterminate] = "selection.hasValue() && !isAllSelected()"
если вы удалите этот вызов this.setData() из isAllSelected, вы увидите только один журнал консоли
обновлять:
в вашем masterToggle вы также вызываете изменение выбора для каждого элемента в таблице, что приводит к тому, что ваш предмет next для каждой строки.
Исправить это можно заменив
this.dataSource.data.forEach((row: any) => this.selection.select(row));
в это
this.selection.select(...this.dataSource.data);
так что это вызывает изменение выбора за один раз
если вы открываете stackblitz в Интернете и выполняете консоль, у меня всегда есть много консоли (многократный цикл) в первой боковой панели дочернего списка, у меня это не работает правильно
ты прочитал и исправил все, что я написал?
Грамматика имеет значение.