2017-01-29 8 views
1

У меня есть следующий код:Используя это обещание обратного вызова

private resetPassword() { 

    this.auth.subscribe(auth => { 
     this.firebaseRef.auth().sendPasswordResetEmail(auth.auth.email).then(
      success => { 
       this.successMessage = 'A password reset email was sent to ' + auth.auth.email + '. Please follow' + 
        'the instructions in the email to reset your password.'; 
      }, 
      error => { 
       console.log(error); 
      } 
     ) 
    }); 

} 

Проблема, что у меня есть, что this.successMessage не установлен на успех. Я могу поставить console.log там, и он работает, но кажется, что я не могу ссылаться на this в этой области. Я пробовал использовать .bind(this) везде, где мог, но это не помогло. Есть предположения?

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

+0

«Вопрос, который я имею, что this.successMessage не установлен на успех» - Как вы можете сказать? Ваш код никогда не пытается прочитать значение обратно. Вам нужно убедиться, что ваш [mcve] * завершен *. – Quentin

+0

Это приложение Angular2, которое отображает 'successMessage' в шаблоне, и этого не происходит. И да, я убедился, что если я установил сообщение за пределами 'then', он будет работать правильно. Я обновлю свое оригинальное сообщение этой информацией. –

+1

@EvanSalter может быть просто из-за того, что ваше угловое приложение не обновляется после действия async, а не значения, которое не задано? Выполняет ли 'console.log (this)' print 'undefined' или показывает, что на самом деле задано значение successMessage? – m0meni

ответ

1

Благодаря @ AR7, я выяснил решение. this.successMessage обновлялся правильно, но шаблон Angular2 не обновлялся. Я решил это, обернув this.successMessage назначение в ngZone.run:

constructor(private ngZone: NgZone) {} 
... 
private resetPassword() { 

    this.auth.subscribe(auth => { 
     this.firebaseRef.auth().sendPasswordResetEmail(auth.auth.email).then(
      success => { 
       this.ngZone.run(() => { 
        this.successMessage = 'A password reset email was sent to ' + auth.auth.email + '. Please follow' + 
         'the instructions in the email to reset your password.'; 
       }); 
       console.log(this); 
      }, 
      error => { 
       console.log(error); 
      } 
     ) 
    }); 

} 
Смежные вопросы