Предотвращение обновления компонента при изменении базовой модели данных - PullRequest
0 голосов
/ 20 декабря 2018

Я строю анкету, в которой есть правила условной видимости в Angular 6. У меня нет контроля ни над предоставляемой структурой данных, ни над бизнес-логикой, которая должна быть реализована, как в текущем решении, которое я перерабатываю:/

Проблема, с которой я сталкиваюсь, такова:

  • У меня есть понятие «видимой» анкеты, которая представляет собой массив разделов, а каждый раздел содержит массив вопросов
  • Когда на вопрос получен ответ, я повторно запускаю правила видимости и создаю массив «temp», который имеет ту же базовую структуру, что и массив видимых вопросов.
  • Затем я использую lodash для объединения этихмассивы, в результате чего ранее скрытые компоненты теперь волшебным образом появляются в вопроснике.
  • Все это прекрасно работает, кроме одной вещи, которая действительно расстраивает меня, по существу, ранее отвеченные вопросы возвращаются в свое состояние без ответа (Angular is reвытягивая их)
  • Разочарование здесь в том, что хотябазовый массив изменился, исходный объект, с которым связан элемент, не изменился.В Vue (с использованием VDOM) ранее визуализированные элементы не меняются, чего я и ожидал.Но в Angular они делают, что, я думаю, связано со стратегией обнаружения изменений Angular.

Я прочитал несколько статей об обнаружении изменений Angular, но либо я просто не получаю его, либо я использую его.дело не поддерживается?Важно, чтобы пользователь все еще мог взаимодействовать с компонентом, но если базовый объект, который HTML использует для рендеринга, не изменился (чего не будет), то я не хочу, чтобы он повторно рендерился.

Главное, на что я смотрю, это ChangeDetectorRef и использую методы detach(), detectChanges() и reattach(), и следую за этим сообщением в блоге https://blog.angularindepth.com/everything-you-need-to-know-about-change-detection-in-angular-8006c51d206f

В моем родительском компоненте я имеюset changeDetection: ChangeDetectionStrategy.OnPush

Ничего, что я пробовал, не работает.Либо компонент не визуализируется изначально (если я использую constructor(public cd: ChangeDetectorRef) { this.cd.detach(); }

, либо я могу заставить его рендериться, но не могу взаимодействовать с компонентом. Или я могу заставить его взаимодействовать, но тогда он простосбрасывает снова, когда базовый массив обновляется.

Я немного растерялся, когда идти дальше. Я бы предпочел просто отказаться от этой вещи и использовать Vue вместо Angular, но, увы, повелительСитх не позволит мне сделать это.

1 Ответ

0 голосов
/ 20 декабря 2018

Насколько я понимаю, вы можете преодолеть это, установив дополнительное свойство для проверки, была ли нажата кнопка «вернуться» или нет, и используйте это как флаг для установки значения - отвечено: true

И если была нажата кнопка «вернуться», вы можете изменить состояние ответившей переменной на false в HTML?

Более того, это больше просто идея, есть множество способов преодолеть это, нопоскольку вы действительно не предоставили никакого кода, очень сложно найти более конкретное решение вашей проблемы.

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