【发布时间】:2017-10-23 02:39:10
【问题描述】:
我对 Angular 还很陌生,所以也许我在这里遗漏了一些重要的东西,但我使用的代码可以在很多存储库中找到,我在问自己我在这里做错了什么。
所以我有这个登录组件,我想在其中使用 Firebase OAuth 进行登录。OAuth 部分工作正常。我可以使用 Facebook、Google 或电子邮件登录。当已经有用户使用这个或那个电子邮件时,问题就会出现在游戏中。这是我的 Facebook 登录代码:
onLoginFacebook() {
this.afAuth.auth.signInWithPopup(new firebase.auth.FacebookAuthProvider())
.catch(error => {
this.error = error.message;
});
}
当已有用户使用给定电子邮件时,尝试登录将导致消息出错p>
"An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address."
如您所见,我只是将此错误消息分配给我的组件的一个变量,该变量声明为:
public error: string;
在我的组件模板中,我想使用 span 来显示错误消息(现在,这对我来说已经足够了,因为我刚刚开始并计划在以后实施适当的错误处理):
<span class="error" *ngIf="error" >{{ error }}</span>
问题出在这里:在我的组件中设置错误消息后,没有任何反应。但是,如果我点击任何按钮或输入,消息就会突然出现。
我认为一旦我设置了变量并且我在 catch() 函数之外设置了变量,Angular 就会自动更新 UI,例如。 G。通过 setTimeout(()=> this.error = "test", 2000),它按我的预期工作。那么我错过了什么或做错了什么? :(
【问题讨论】:
-
检查
Zone.current.name并尝试zone.run -
这个区域属性应该来自哪里?这是第三方库吗?我现在想让我的代码尽可能简洁
-
@yurzui
Zone与问题有何关系? -
@IgorSoloydenko Angular 2 确实使用区域进行更改检测。基本上每个异步操作都包装在一个区域中 - 区域有一个非常有趣的错误处理案例(以至于 Node 阻塞了它们) - 其中一部分是进行自己的错误处理的抽象(如承诺/可观察对象)自己的错误处理 - 并且 Angular 没有正确使用区域来包装承诺。幸运的是,有一个人是这两个方面的专家,我会通过电子邮件向他发送这个问题。
-
看起来 bug 是 Angular 的 Zone.js 中的 in this code,我会提出问题。
标签: angular user-interface promise try-catch