При сохранении в локальное хранилище нет необходимости пытаться вставить выбранное значение в существующее значение - просто записывайте все, что у вас есть, в локальное хранилище каждый раз, когда изменяется состояние.
Подход, который я выбрал бы:
- Получить названия городов
- Извлечь выбранные города из локального хранилища и применить
checked
значение - При изменении флажка сохранить текущие выбранные города в локальное хранилище
Шаг 1 - загрузка городов
Вы получаете массив городов из вашего API. Для целей этого ответа я буду использовать массив строк, чтобы упростить его, но преобразовать его в использование объектов тривиально.
После того, как вы получили свои города, вам потребуется извлечь выбранные города из локального хранилища. , Я собираюсь сохранить список названий городов, разделенных запятыми, для этого примера, но вы можете сохранить любые уникальные значения, которые вы будете иметь sh.
component.ts
cityList: { name: string, checked: boolean }[];
ngOnInit() {
this.getCities().subscribe((cities: string[]) => {
const selected: string[] = [];
const stored: string = localStorage.getItem('cities');
if (stored) {
// split comma-separated string into array of city names
selected.push(...stored.split(','));
}
// map retrieved cities to our model,
// applying checked where we find a city in local storage
this.cityList = cities.map(name => ({
name: name,
checked: selected.includes(name)
}));
});
}
Ваш * В 1043 * есть несколько ненужных вещей. Вам не нужно управлять состоянием флажка, если вы используете компонент [(ngModel)]
.
. html
<div *ngFor="let city of cityList; let i = index">
<label>
{{city.name}}
<input type="checkbox" [(ngModel)]="city.checked" (ngModelChange)="saveCities()" />
</label>
</div>
Шаг 2 - сохранение городов
Все довольно простые вещи. Функция saveCities()
в component.ts
выполняет сериализацию названий выбранных городов в локальное хранилище при каждом обновлении флажка.
component.ts
saveCities() {
const selected: string[] = this.cityList
.filter(x => x.checked)
.map(x => x.name);
const serialized: string = selected.join(',');
localStorage.setItem('cities', serialized)
}
DEMO: https://stackblitz.com/edit/angular-rww9fr