Решено
Как упоминается ниже Аароном, подход «Другой вариант» работает без проблем и кажется намного чище. Я оставлю обновления и все остальное на случай, если у кого-то в будущем возникнет аналогичная проблема, и обходные пути как-то пригодятся.
У меня странная проблема при попытке визуализировать динамические компоненты внутри таблицы материалов Angular с разбивкой на страницы и сортировкой.
Вот Stackblitz с воспроизведенной проблемой. Судя по тому, что я исследовал, похоже, что это какая-то проблема с обнаружением изменений, хотя я могу ошибаться в этом, поскольку понятия не имею, почему это происходит. Если у кого-то есть идеи, как решить эту проблему, или если я делаю что-то явно не так, мы будем очень благодарны за отзывы и помощь.
Текущее поведение:
Я использую @ViewChildren и ComponentFactoryResolver внутри таблицы материального дизайна для динамического рендеринга компонентов с несколькими страницами данных. Все выглядит нормально, однако при использовании matSort для сортировки данных некоторые строки с динамическими компонентами показывают неправильные значения данных, тогда как остальная часть строки (нединамическая) имеет правильные. Смотрите скриншоты ниже:
Перед сортировкой:
После сортировки:
консольный журнал экземпляров компонентов (обратите внимание, что передано правильное поле статуса, но отображается неправильное).
Ожидаемое поведение:
При сортировке данные и визуализированные компоненты отображаются правильно. Должно соответствовать полю dataSource.data.
Минимальное воспроизведение проблемы с инструкциями:
Посетите Stackblitz и запустите приложение. Щелкните заголовок сортировки для статуса заказа. Обратите внимание, как первая запись в таблице говорит «Доставлено», а фактический источник данных - как «Отменено». Также не то, чтобы остальная часть строки была точной - просто динамически отображаемый компонент неверен.
Что я пробовал:
Пытался установить статус с помощью get () и set () вместо @Input () и зарегистрировать ngOnChage, где я вызываю changeDetectorRef из самого компонента, но проблема не исчезла.
Пробовал менять ChangeDetectionStrategy - ни один ничего не сделал.
Также пробовал решения в приведенном ниже разделе
Возможные похожие сообщения, которые я просматривал, но не упоминал о решениях
Кажется, это та же проблема, но ответа на нее так и не было. Я надеюсь, что предоставление Stackblitz поможет получить тот же ответ. Судя по плакату, это какая-то проблема с обнаружением изменений.
Пытался явно вызвать методы detectChanges () и markForCheck () chanceDetectionRef для componentRefs, родительского компонента, фактического компонента, который динамически создается безуспешно.
Проблема обнаружения изменения загрузчика динамических компонентов Angular
Обнаружение изменений не работает при создании компонента через ComponentFactoryResolver а>
Возможное решение / более странное поведение:
Если вы сортируете по статусу заказа и получаете неправильное значение, которое должно быть в первой строке, как раньше, а затем переходите на следующую страницу и обратно, компонент показывает правильное значение. Я предполагаю, что разбиение на страницы вызывает какое-то обнаружение изменений в таблице материалов, или в шаблонах, или в чем-то подобном, но я понятия не имею, почему сортировка этого не делает. Текущая работа, которую я собираюсь, - это просто переходить на следующую страницу и обратно, однако это ни в коем случае не приемлемое решение, и я действительно хотел бы понять, что я делаю здесь не так, или какое исправление для этого является.
Обновление 1
В соответствии с дополнительными сведениями Аарона ниже, я добавил Обновлен Stackblitz с гораздо более упрощенным примером. При более внимательном рассмотрении нумерация страниц не играет роли в странном поведении. Я могу воспроизвести проблему всего с двумя записями таблицы и сортировкой (весь код разбивки на страницы удален). Я изменил входящие данные, чтобы они соответствовали строкам, чтобы было понятнее, какие строки откуда берутся.
Вот комбинированный снимок экрана до и после сортировки с 2, 3 и 4 записями:
В настоящее время я пытаюсь проверить, могу ли я заставить таблицу повторно отрисоваться (при условии, что она, возможно, что-то меняет), и в конечном итоге собираюсь копаться в исходном коде таблицы.
Обновление 2
Один обходной путь, который я смог найти, - это установить мой dataSource в пустой массив после того, как я сохранил его копию с splice()
в onSortChange()
прямо перед выполнением моей логики фильтрации, а затем вернул ее к отфильтрованному массиву. Я предполагаю, что это вызывает какое-то обновление в источнике данных / таблице материалов, которое вызывает повторную визуализацию или обновление. Я буду продолжать пытаться выяснить, есть ли лучший подход к этому, поскольку это кажется странным, и в моем исходном приложении у меня есть filterPredicate, который также вызывает ту же проблему при фильтрации / сбросе фильтра.
Обновление 3
Аааааи, наконец, после еще нескольких исследований по этому поводу, я пришел к хотя бы некоторому решению, которое имеет смысл. После того, что я сказал в обновлении №2, я нашел этот пост:
https://github.com/angular/components/issues/15972#issuecomment-490235603
что объясняет, почему таблица не получает обновленный источник данных. В моем случае это было, вероятно, намного сложнее понять, поскольку я выполнял сортировку / фильтрацию и не думал, что это будет напрямую связано с этим. Я все еще рассмотрю еще несколько идей в ближайшие несколько дней, но если ни одна из них не сработает, я отмечу это как решенное после этого.