Сохранение состояния переключения мат-слайда переключения

#javascript #angular #typescript

#javascript #угловой #typescript

Вопрос:

Я использую slide-toggle в aproject.Однако я не могу сохранить переключенный stae.Каждый раз, когда я обновляю страницу, переключатель слайдов возвращается в состояние по умолчанию вместо того, чтобы оставаться в переключенном состоянии.Я новичок в angular и не знаю, что делать.Пожалуйста, помогите.Заранее спасибо.

Вот код ts:

 export class ToggleComponent implements OnInit {
  @Output()
  change: EventEmitter<MatSlideToggleChange> ;
  @Input()
checked: Boolean 
  ngOnInit() {
  }
  isChecked = true;
  formGroup: FormGroup;
  filteringSchedule: boolean ;
  toggle:Boolean;

  constructor(formBuilder: FormBuilder) {
    this.formGroup = formBuilder.group({
      enableWifi: false,
      acceptTerms: [false, Validators.requiredTrue]
    });
  }

  onFormSubmit(formValue: any) {
    alert(JSON.stringify(formValue, null, 2));
  }

  onChange(ob: MatSlideToggleChange) {
    this.filteringSchedule=!this.filteringSchedule;
    console.log(!this.filteringSchedule);
  } 
}
  

Код шаблона:

 <form class="example-form" [formGroup]="formGroup" (ngSubmit)="onFormSubmit(formGroup.value)" ngNativeValidate>
  <mat-action-list>
    <mat-list-item > <mat-slide-toggle  (change)="onChange($event)"  [checked]="filteringSchedule"  formControlName="enableWifi" >Enable Wifi</mat-slide-toggle></mat-list-item> 
    <mat-list-item > <mat-slide-toggle formControlName="acceptTerms">Accept Terms of Service</mat-slide-toggle></mat-list-item>
</mat-action-list>
  <p>Form Group Status: {{ formGroup.status}}</p>

  <button mat-rasied-button type="submit">Save Settings</button>
</form>
  

Комментарии:

1. Попробуйте использовать локальное хранилище

2. Можете ли вы привести мне пример. Извините, я только что запустил angular.

3. проверьте опубликованный ответ

Ответ №1:

Для сохранения состояния кнопки переключения можно использовать веб-хранилища (переключаемая кнопка не изменяется при обновлении страницы).

Здесь я сделал рабочую демонстрацию Stackblitz с кодом, который вы предоставили для своего приложения. Я использовал локальное хранилище для достижения желаемой функции.

Ваш компонент ToggleComponent обновляется ниже:-

 import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core';
import { MatSlideToggleChange } from '@angular/material';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';

@Component({
  selector: 'app-toggle',
  templateUrl: './toggle.component.html',
  styleUrls: ['./toggle.component.css']
})
export class ToggleComponent implements OnInit {
  @Output() change: EventEmitter<MatSlideToggleChange>;
  @Input() checked: boolean;

  isChecked = true;
  formGroup: FormGroup;
  filteringSchedule: boolean;
  toggle: boolean;

  constructor(
    private formBuilder: FormBuilder
  ) { }

  ngOnInit() {
    this.filteringSchedule = JSON.parse(localStorage.getItem('toggleButtonState'));
    this.formGroup = this.formBuilder.group({
      enableWifi: this.filteringSchedule,
      acceptTerms: [false, Validators.requiredTrue]
    });
  }

  onFormSubmit(formValue: any) {
    alert(JSON.stringify(formValue, null, 2));
  }

  onChange(ob: MatSlideToggleChange) {
    this.filteringSchedule = !this.filteringSchedule;
    localStorage.setItem('toggleButtonState', JSON.stringify(this.filteringSchedule));
  }
}
  

Также обратите внимание: — Чтобы быть согласованным для пользователя во всех браузерах, в дополнение (или вместо) к сохранению переключенного состояния кнопки в файлах cookie / локальном хранилище, вы можете сохранить его на стороне сервера и при загрузке сайта получать информацию о переключенном состоянии кнопки с сервера.

На стороне обратите внимание, что код конструктора форм, который вы разместили внутри конструктора, должен храниться внутри ngOnInit , чтобы избежать проблем с производительностью приложения.

Надеюсь, это полезно.

Ответ №2:

Сохраните свое свойство переключения localStorage , а затем вы сможете получить localStorage значение для ngOnInit метода.

Вы даже можете использовать sessionStorage в зависимости от ваших требований. Использование localStorage и sessionStorage практически идентично, вам просто нужно заменить одно другим.

 onChange(ob: MatSlideToggleChange) {
  this.filteringSchedule = !this.filteringSchedule;
  localStorage.setItem('yourKey', JSON.stringify(this.filteringSchedule));
}

ngOnInit() {
  this.filteringSchedule = localStorage.getItem('yourKey') == 'true';
}