В Angular 17 попытка очистить ввод после того, как пользователь зашел на страницу с помощью кнопки «Назад», приводит к появлению некогерентных значений

В моем проекте Angular 17 есть страница, которая выполняет перенаправление. Я хочу иметь возможность очищать поле ввода, если пользователь нажимает кнопку «Назад» после перенаправления, поскольку браузер (Chrome) сохраняет старые значения.

Много ища, я нашел это решение для очистки поля:

@ViewChild('iptUrl')
set watch(iptUrl: ElementRef) {
    if (iptUrl) {
        console.info('test1', iptUrl);
        console.info('test2', '#' + iptUrl.nativeElement.value + '#');

     // iptUrl.nativeElement.value = '';
     // The above line is what I would do to clean the input. 
     // It's commented so it doesn't interfere in the debugs.

    }
}

Но я получаю иррациональный результат отладки: Когда я раскрываю консоль, объект iptUrl из первого console.info (test1) свойства iptUrl.nativeElement сообщает, что значение равно "https://192.168.0.155:4200/feee5230". Правильный. Старое значение, которое я хочу очистить. Но второй console.info (test2) возвращает «##». Если я попытаюсь сделать iptUrl.nativeElement.value = ''; так, как мне хотелось бы, ничего не произойдет, и ввод сохранит старое значение:/

Если я попробую JSON.stringify(iptUrl), вот результат в консоли:

{"nativeElement":{"__ngContext__":8,"__zone_symbol__inputfalse":[{"type":"eventTask","state":"scheduled","source":"HTMLInputElement.addEventListener:input","zone":"angular","runCount":0}],"__zone_symbol__blurfalse":[{"type":"eventTask","state":"scheduled","source":"HTMLInputElement.addEventListener:blur","zone":"angular","runCount":0}],"__zone_symbol__compositionstartfalse":[{"type":"eventTask","state":"scheduled","source":"HTMLInputElement.addEventListener:compositionstart","zone":"angular","runCount":0}],"__zone_symbol__compositionendfalse":[{"type":"eventTask","state":"scheduled","source":"HTMLInputElement.addEventListener:compositionend","zone":"angular","runCount":0}],"__zone_symbol__ngModelChangefalse":[{"type":"eventTask","state":"scheduled","source":"HTMLInputElement.addEventListener:ngModelChange","zone":"angular","runCount":0}],"__zone_symbol__keyupfalse":[{"type":"eventTask","state":"scheduled","source":"HTMLInputElement.addEventListener:keyup","zone":"angular","runCount":0}]}}

Нет ценного свойства.

Вот изображение вывода обеих отладок console.info выше:

Что тут происходит ?

Это определение ввода в шаблоне:

<input [(ngModel)] = "url" (keyup) = "validate($event)" #iptUrl id = "iptUrl" class = "form-control form-control-lg empty" type = "text" placeholder = "Write here!" aria-label = "Write here!" required>

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

Спасибо.

Редактировать

Просто чтобы внести ясность: я почти уверен, что для свойства url компонента установлена ​​пустая строка. Доказательство:

Если я попытаюсь сделать:

@ViewChild('iptUrl')
set watch(iptUrl: ElementRef) {
    if (iptUrl) {
        console.info('test1', iptUrl);
        console.info('test2', '#' + iptUrl.nativeElement.value + '#');
        console.info('test3', '%' + this.url + '%');
                    
        //          iptUrl.nativeElement.value = '';
        //          window.iptUrl.value = '';
    }
}

это результат:

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самым простым решением является принудительное обновление при нажатии кнопки «Назад», поскольку в приложениях SPA, таких как angular, возникают проблемы с кнопкой «Назад».

import { HostListener } from '@angular/core';

@HostListener('window:pageshow', ['$event'])
onPopState(event) {
  location.reload()
}

Я занимаюсь этой проблемой уже несколько часов. Я все это пробовал. Вот Paste.bin моих (теперь прокомментированных) OnInit-отладок. Я также пробовал события OnDestroy и маршрутизатора. OnDestroy не сработал, Router Events ничего не делает, как код в вопросе. Вход каким-то образом получает значение, не привязанное к компоненту. Вероятно, это какой-то фоновый рендеринг из самого браузера. Изменение связанного свойства компонента ничего не дает, поскольку это уже пустая строка.

Nelson Teixeira 27.06.2024 11:43

Смотрите мое редактирование по вопросу

Nelson Teixeira 27.06.2024 11:51

@NelsonTeixeira обновил мой ответ новым подходом

Naren Murali 27.06.2024 11:55
popstate не сработало. Но pageshow и load сработали. Это решило ситуацию. Хорошо бы отредактировать ответ с popstate на pageshow и удалить остальные нерабочие тесты, чтобы не вводить в заблуждение других читателей. Спасибо, что избавили меня от 4-часовой тряски головой :)
Nelson Teixeira 27.06.2024 13:27

Просто ради завершения я не делал location.reload(). Я сделал это: if (this.iptUrl !== undefined) this.iptUrl.nativeElement.value = '';, iptUrl определяется как: ViewChild('iptUrl') iptUrl: ElementRef | undefined;

Nelson Teixeira 27.06.2024 13:45

Другие вопросы по теме