#angular
#angular
Вопрос:
Когда я пытаюсь выбрать адрес из списка с помощью переключателя и сохранить в localstorage, в результате я получаю null.
Как это исправить?
HTML:
<form [formGroup]="form">
<ion-list>
<ion-radio-group formControlName="pickup_points_id">
<ion-item *ngFor="let pickuppoint of pickuppoints">
<ion-label>{{pickuppoint.address}}</ion-label>
<ion-radio slot="start" [value]="pickuppoint.pickup_point_id" (click)="onSelectPickupPoint()"></ion-radio>
</ion-item>
</ion-radio-group>
</ion-list>
</form>
ts:
onSelectPickupPoint() {
localStorage.setItem('selectedPickupPoint', this.form.value.pickup_points_id);
console.log(localStorage.getItem('selectedPickupPoint'))
}
Комментарии:
1. попробуйте поместить код
onSelectPickupPoint
в asetTimeout(() => {})
просто для того, чтобы убедиться, что событие щелчка обработано правильно, прежде чем сохранять значение. Остальная часть вашего кода выглядит нормально. Другой вещью может быть инициализацияthis.form
поля2. @bvdb Хм. а если установить Timeout, то все работает.
3. @bvdb Может быть, можно как-то избавиться от setTimeout?
4. попробуйте
(change)
событие. Я думаю, что это вызывается после обработки события, фактически изменяя форму. Но это немного непредсказуемо, потому что это немного зависит от типа элемента формы. Кроме того, я думаю(change)
, что событие иногда вызывается несколько раз, например, при потере фокуса после редактирования поля ввода. Что может не быть проблемой в вашем случае.
Ответ №1:
Проблема в том, что значение еще не обработано. (click)
Событие срабатывает непосредственно перед обновлением формы. Это фактически дает вам контроль над событием. Например, это дает вам возможность отменить событие. (например, путем передачи $event
функции в коде вашего шаблона и вызова e.stopPropagation()
метода).
Итак, если вы выполните код с помощью a setTimeout
, он фактически будет исправлен, потому что сначала будет обработано событие. Это позволяет ему обновлять форму с новым значением. Наконец, когда время ожидания будет обработано this.form.value.pickup_points_id
, будет сохранено правильное значение.
Другим решением может быть использование (change)
вместо этого события, которое будет запущено после изменения значения.
Ответ №2:
Вы можете попробовать это:
(click)="onSelectPickupPoint($event.target.value)"
.ts:
onSelectPickupPoint(point_id: number) {
localStorage.setItem('selectedPickupPoint', point_id);
}
Это работает для ввода текста. попробуйте это на радио и посмотрите.