Hi I have a problem with loading data from localStorage into a select component. I would like each select after selecting different options to be saved in localStorage and after refreshing the page, the value from the select will be remembered, currently the last option is remembered and loaded to all
app.component.html
<div class="columns">
<div class="column">
<app-select></app-select>
</div>
<div class="column">
<app-select></app-select>
</div>
<div class="column">
<app-select></app-select>
</div>
</div>
select.component.html
<select
name="brewers"
[(ngModel)]="selectedOption"
(ngModelChange)="selectOption()"
(click)="saveData($event)"
>
<option selected>Choose your profile</option>
<option *ngFor="let brewer of brewers$ | async" value="{{brewer}}" >{{ brewer }}</option>
</select>
select.component.ts
ngOnInit(): void {
this.brewers$ = this.beersService.createBrewers().pipe(
map((res : any) => [...new Set(res)].sort())
);
this.selectedOption = localStorage.getItem('latestSelect') ? localStorage.getItem('latestSelect') : '';
this.selectOption();
}
selectOption() {
this.beers$ = this.beersService.getBeers().pipe(
map((res : any) => res.filter(beer => beer.brewer === this.selectedOption))
);
this.amountBeers = this.nextBeers;
// localStorage.setItem('latestSelect', this.selectedOption);
}
loadMore() {
this.amountBeers += this.nextBeers;
}
get getAmountOfNextBeers() {
return this.amountBeers;
}
beerPlaceholder(e) {
e.target.src = 'assets/DefaultBeer.png';
}
saveData(e) {
if ('beer-left' === e.target.id) {
localStorage.setItem('left-column', this.selectedOption);
} else if ('beer-right' === e.target.id) {
localStorage.setItem('right-column', this.selectedOption);
} else {
localStorage.setItem('center-column', this.selectedOption);
}
}
Advertisement
Answer
It will be much easier if you add an input parameter.
My solution:
Add
@Input() side: 'left' | 'right' | 'center';at your custom select component.Change the
saveDatafunction as:saveData(e) {
if (this.side === "left") { localStorage.setItem('left-column', this.selectedOption); } else if (this.side === "right") { localStorage.setItem('right-column', this.selectedOption); } else { localStorage.setItem('center-column', this.selectedOption); } }Change app.component.html as:
<div class="columns">
<div class="column">
<app-select [side]="'left'"></app-select>
</div>
<div class="column">
<app-select [side]="'center'"></app-select>
</div>
<div class="column">
<app-select [side]="'right'"></app-select>
</div>
</div>Edit:
- Now, to set stored data from localStorage, add these lines at
selectcomponent’sngOnInithook:
if (this.side === "left" && localStorage.getItem("left-column")) {
this.selectedOption = localStorage.getItem("left-column");
} else if (this.side === "right" && localStorage.getItem("right-column")) {
this.selectedOption = localStorage.getItem("right-column");
} else if (this.side === "center" && localStorage.getItem("center-column")) {
this.selectedOption = localStorage.getItem("center-column");
}Note: I’ve added an extra Save button after each select for test purposes.
Result:
I’ve demonstrated a broken(!) but working solution at Stackblitz.
