В моем проекте 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 = '';
}
}
это результат:
Самым простым решением является принудительное обновление при нажатии кнопки «Назад», поскольку в приложениях SPA, таких как angular, возникают проблемы с кнопкой «Назад».
import { HostListener } from '@angular/core';
@HostListener('window:pageshow', ['$event'])
onPopState(event) {
location.reload()
}
Смотрите мое редактирование по вопросу
@NelsonTeixeira обновил мой ответ новым подходом
popstate
не сработало. Но pageshow
и load
сработали. Это решило ситуацию. Хорошо бы отредактировать ответ с popstate
на pageshow
и удалить остальные нерабочие тесты, чтобы не вводить в заблуждение других читателей. Спасибо, что избавили меня от 4-часовой тряски головой :)
Просто ради завершения я не делал location.reload(). Я сделал это: if (this.iptUrl !== undefined) this.iptUrl.nativeElement.value = '';
, iptUrl
определяется как: ViewChild('iptUrl') iptUrl: ElementRef | undefined;
Я занимаюсь этой проблемой уже несколько часов. Я все это пробовал. Вот Paste.bin моих (теперь прокомментированных) OnInit-отладок. Я также пробовал события OnDestroy и маршрутизатора. OnDestroy не сработал, Router Events ничего не делает, как код в вопросе. Вход каким-то образом получает значение, не привязанное к компоненту. Вероятно, это какой-то фоновый рендеринг из самого браузера. Изменение связанного свойства компонента ничего не дает, поскольку это уже пустая строка.