Проблема с использованием Angular, локального хранилища и NgIf

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

Когда они доберутся до одного конкретного вопроса, им будут показаны разные тексты и варианты в зависимости от того, какой вариант они выбрали. Если они выберут «одного» заявителя, то на следующем шаге им будет показано одно поле ввода. Если они выберут «двух» кандидатов, им будут показаны два поля ввода.

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

Вот грубый пример. Если я никогда раньше не пользовался приложением и в моем локальном хранилище ничего нет и я выбираю "двух" претендентов:

Скриншот 1Проблема с использованием Angular, локального хранилища и NgIf

На следующем шаге он показывает мне только одно поле (это значение по умолчанию, но их должно быть два, потому что это то, что я выбрал), и он не заполняет текстовый текст:

Скриншот 2Проблема с использованием Angular, локального хранилища и NgIf

Теперь, если я перезагружу приложение и вернусь к тому же вопросу и на этот раз выберу «один»:

Проблема с использованием Angular, локального хранилища и NgIfСкриншот 3

На этот раз он покажет текст, связанный с двумя пользователями и двумя полями ввода, хотя я выбрал «один»:

Проблема с использованием Angular, локального хранилища и NgIfСкриншот четыре

Таким образом, у него есть «задержка» (из-за отсутствия лучшего слова), когда он показывает только выбор, сделанный на последнем сеансе.

Я пробовал несколько вариантов того, как решить эту проблему, но все они, похоже, дают мне один и тот же результат, и я уже просмотрел Stackoverflow и Google, чтобы узнать, есть ли у кого-нибудь похожая проблема, но я не смог найти все, что мне поможет.

Вот соответствующий код из моего component.html:

        <mat-step label = "Step 2" [stepControl] = "secondFormGroup">
            <form [formGroup] = "secondFormGroup">

                <div ng-controller = "step2">

                <h2>How many people are applying?</h2>

                <mat-button-toggle-group>
                    <div *ngFor = "let step2option of step2options">
                      <mat-button-toggle (click) = "getStep2Val(Oname);" class = "btn btn-primary step-button" id = "{{step2option.id}}" [ngClass] = "status ? 'selected' : ''"><span #Oname>{{step2option.text}}</span></mat-button-toggle>
                    </div>
                </mat-button-toggle-group>

                <div>You chose <strong>{{ selectedStep2option }}!</strong></div>

                <button mat-stroked-button (click) = "goToNext()" class = "btn btn-secondary continue-btn" [disabled] = "selectedStep2option === 'none'">Continue</button>

              </div>

              </form>
        </mat-step>

        <mat-step label = "Step 3" [stepControl] = "thirdFormGroup">
            <form [formGroup] = "thirdFormGroup">
                <div ng-controller = "step3">
                    <h2>What <span *ngIf = "users === 'One'">{{text1app}}</span> <span *ngIf = "users === 'Two'">{{text2app}}</span>?</h2>

                    <div class = "input-group" *ngIf = "users == 'One' || 'Two'" >
                      <p>Applicant 1</p>
                      <span class = "input-group-addon">£</span>
                      <input type = "number" (change) = "getStep3Val()" (keyup) = "getStep3Val()" [(ngModel)] = "app1income" [ngModelOptions] = "{standalone: true}" id = "step3appVal" min = "0" step = "500" data-number-to-fixed = "2" data-number-stepfactor = "500" />
                      {{app1income}}
                    </div>

                    <div class = "input-group" *ngIf = "users == 'Two'">
                      <p>Applicant 2</p>
                      <span class = "input-group-addon">£</span>
                      <input type = "number" (change) = "getStep4Val()" (keyup) = "getStep4Val()" [(ngModel)] = "app2income" [ngModelOptions] = "{standalone: true}" id = "step4appVal" min = "0" step = "500" data-number-to-fixed = "2" data-number-stepfactor = "500" />
                      {{app2income}}
                    </div>

                    <button mat-stroked-button (click) = "goToNext()" class = "btn btn-secondary continue-btn" [disabled] = "app1income === 0">Continue</button>

                  </div>
            </form>
        </mat-step>

И из моего component.ts:

  users: string;

  getUsers() {
    this.users = this.readLocalStorageValue('Number of applicants');
  }

  readLocalStorageValue(key: string): string {
    return localStorage.getItem(key);
  }

  selectedStep2option: string = 'none';

  step2options = [
    {
      text: 'One',
      id: 'step2one'
    },
    {
      text: 'Two',
      id: 'step2two'
    }
  ];

  getStep2Val (Oname: any) {
    this.selectedStep2option = Oname.textContent;
    localStorage.setItem('Number of applicants',  Oname.textContent);
  }

  text1app: string = 'is your income';
  text2app: string = 'are your incomes';

На данный момент я не могу понять, почему такая задержка в выборе, который делает пользователь. Кто-нибудь знает, почему это может быть сделано? Или это совершенно многословный способ сделать это, и мне не хватает гораздо более простого способа иметь эту условную логику. Я довольно новичок в Angular, поэтому я могу пойти по совершенно неправильному пути.

Любая помощь будет принята с благодарностью.

Не могли бы вы воссоздать свою проблему на StackBlitz?

ViqMontana 20.06.2019 11:18

Почему вы используете локальное хранилище?

Mehdi Benmoha 20.06.2019 11:56

@Viqas - я пытался посмотреть, смогу ли я воссоздать эту часть проблемы Stackblitz, но, поскольку на самом деле это компонент большего приложения, над которым я работаю для клиента, это не сработало. Это означало бы, что мне пришлось бы делиться большим количеством кода, которым я бы не хотел делиться на общедоступном форуме, поскольку работа над ним еще не завершена. Сердечно извиняюсь.

RocketMatt 20.06.2019 12:14

@MehdiBenmoha - так как мне нужно где-то хранить мои значения, и у меня нет базы данных или чего-то подобного, чтобы подключиться к ней в данный момент. У вас есть предложение относительно того, что я мог бы использовать вместо этого?

RocketMatt 20.06.2019 12:17

Я видел, что вы нашли решение, и это хорошо. Тем не менее, я предлагаю вам по возможности избегать использования localStorage. Существуют и другие способы обеспечения связи между компонентами. Ищите декораторы @Input/@Output и менеджеры состояний, такие как NgRx, если ваше приложение усложняется.

Mehdi Benmoha 20.06.2019 13:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
242
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не бери в голову. Я понял. Это был простой случай, когда моя функция getUsers() вызывалась не в том месте.

Это должно было быть здесь:

                <button mat-stroked-button (click) = "goToNext(); getUsers()" class = "btn btn-secondary continue-btn" [disabled] = "selectedStep2option === 'none'">Continue</button>

Вместо этого это было на более раннем шаге.

Типичный случай, когда вы просите кого-то о помощи, решение приходит вам в голову.

Другие вопросы по теме