以下是我非常精简的代码。
app.component.html
<app-nav></app-nav>
<app-login *ngIf="!loggedIn"></app-login>
app.component.ts
loggedIn: boolean;
...
//Shared service login logic - this stuff works
loggedIn = true;
loggedIn = false;
login.component.ts
email: string;
pass: string;
Login(){
//Shared service login logic - passes in this.email and this.pass
//unset password but keep email
}
login.component.html
<input type="email" required [(ngModel)]="email" />
<input type="password" required [(ngModel)]="pass" />
<button type="submit" (click)="Login()">Sign In</button>
我的代码效果很好,大部分都符合预期。当用户未登录时,<app-login>
组件不可见,反之亦然。但是,我的意图是仅在login.component.ts
中取消设置密码,因为电子邮件<input>
使用email
绑定到ngModel
我会认为它会被保留。
但是,当解构模型并从DOM中删除时,似乎所有局部变量都未设置。我该怎么做才能防止这种情况发生?
答案 0 :(得分:3)
有很多方法可以做到这一点。您可以将电子邮件存储在app.component中,使用本地存储或共享服务。
app.component.html
<app-nav></app-nav>
<app-login [email]="email" *ngIf="!loggedIn"></app-login>
app.component.ts
loggedIn: boolean;
...
//Shared service login logic - this stuff works
loggedIn = true;
loggedIn = false;
//new variable
email = ""
并在您的login.component中,将@Input添加到您的代码中以从app.component获取电子邮件。
@Input email;
每当您登录时,请将电子邮件保存在本地存储中,如下所示
Login(){
localStorage.setItem('email', email);
// your login code
}
稍后再次创建login.component时通过构造函数检索它。
constructor(){
this.email = localStorage.getItem('email');
}
使用本地存储时,实现几乎完全相同,您需要在登录时设置电子邮件,并在再次创建登录组件时再次检索电子邮件。只需确保在app.module中提供它,使其成为单身人士。
希望这有帮助
答案 1 :(得分:2)
您可以让login
组件拥有@Output
和@Input
以及implement
onDestroy
。您的@Output
将EventEmitter
将数据发送回app.component
,您的@Input
值将作为参数收到电子邮件,最后在ngOnDestroy
内emit
email
{1}} app.component
到app.component
的值在组件销毁之前,变量将在login
内更新,这意味着下次@Input
呈现时,它将会感谢login.component
上{{1}}接受电子邮件作为参数