Я строю анкету, в которой есть правила условной видимости в 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, но, увы, повелительСитх не позволит мне сделать это.