Как получить тайм-аут или задержку при работе в AngularJS

#javascript #angularjs

#javascript #angularjs

Вопрос:

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

Следующий код записывает оценку судьи в базу данных, а затем запрещает этому судье снова забивать, пока оценка не будет удалена из базы данных. Я хочу, чтобы под панелью судей появлялось сообщение, когда судья отправляет свой результат, что-то вроде «OK!». В настоящее время он появляется, когда устанавливается значение isLoading = true, но только очень кратко, потому что, как вы можете видеть из приведенного ниже кода, он превращается в false . Мне нужно, чтобы он автоматически превращался в false, но только через 3 или около того секунды.

 async send(): Promise<any> {
try {
  this.isLoading = true;
  const star: { isValid: boolean } = await this.judgeService.submitScoreIsValid(this.id).toPromise();
  if (star.isValid === true) {
    await this.judgeService.write(this.id, {score: this.currentScore}).toPromise();
    this.status = true;
  } else {
    this.status = false;
  }
} catch (e) {
  console.log(e);
} finally {
  this.isLoading = false;
}
}
  

Я хочу, чтобы isLoading равнялся true, но только примерно на 3 секунды. Как я могу это сделать?

Я пытался перейти:

 this.isLoading=true;    
$timeout(function(){ this.isLoading=false; }, 3000);
  

но это не сработало, оно просто остается и не исчезает через 3 секунды. Кто-нибудь может помочь?

Мой интерфейс таков:

 <div *ngIf="isLoading">
     <h5>OK!</h5>
</div>
  

* отредактировано, чтобы отразить изменения, внесенные по предложению одного из ответов ниже.

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

1. Вы используете AngularJS или Angular ? Пожалуйста, обратите внимание, что оба фреймворка полностью отличаются друг от друга.

Ответ №1:

Прежде всего, если у вас есть выбор и вы не застряли с обновлением устаревшего кода, жизнь будет намного проще, если вы будете работать с новым Angular вместо старого AngularJS. Вам не придется так сильно беспокоиться о цикле дайджеста и о том, обнаруживаются ли AngularJS изменения, которые вы вносите в значения переменных.

В любом случае, написанный вами код указывает angular установить isLoading значение true через 3 секунды, а не на 3 секунды. Что вам нужно сделать, это:

 $timeout(function() { this.isLoading = true; });
$timeout(function() { this.isLoading = false; }, 3000);
  

… то есть сначала установите для него значение true , а затем через 3 секунды установите для него значение false .

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

1. спасибо за ответ. Я внес изменения в код, но сообщение появляется, но остается там навсегда. это не исчезнет.

2. Я обновил приведенный выше код. Я не заметил, что вы не были в правильном контексте дайджеста, прежде чем также выполнить тайм-аут. Надеюсь, это сработает. (Прошло много времени с тех пор, как я касался AngularJS!)

3. та же проблема. «ОК!» не исчезает. он остается включенным.

Ответ №2:

вам нужно сделать это:

 $timeout(() => this.isLoading = false, 3000);
  

функции, не являющиеся стрелками, создают новый this контекст, функции со стрелками сохраняют внешний this

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

1. спасибо, но «ОК!» никуда не денется. он остается включенным. async send(): Promise<any> { try { this.isLoading = true; const star: { isValid: boolean } = await this.judgeService.submitScoreIsValid(this.id).toPromise(); if (star.isValid === true) { await this.judgeService.write(this.id, {score: this.currentScore}).toPromise(); this.status = true; } else { this.status = false; } } catch (e) { console.log(e); } finally { $timeout(() => this.isLoading = false, 3000); } }