gpt4 book ai didi

angularjs - Angular 2 : How to communicate from parent component to child?

转载 作者:太空狗 更新时间:2023-10-29 17:36:07 25 4
gpt4 key购买 nike

我正在标签之间加载一些 div。如下所示。

这是我的 index.html

<html>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
</head>

<!-- 3. Display the application -->

<body>
<my-app>Loading...</my-app>
</body>
</html>

app.module.ts

@NgModule({
imports: [
BrowserModule,
FormsModule,
AppRoutingModule
],
declarations: [
AppComponent,
LoginComponent,
HomeComponent,
NewsfeedComponent,
TopBarComponent,
SideMenuComponent
],
providers : [
AuthGaurd
],
bootstrap: [
AppComponent
] })
export class AppComponent {}

home.component.ts

@Component({
selector: 'home',
moduleId: module.id,
templateUrl: 'home.component.html',
providers : [
LoginService
]
})

export class HomeComponent implements OnInit{
isLoggedin : boolean;
constructor (private loginService : LoginService) { }
ngOnInit(): void {
this.loginService.getLogged().subscribe((isLoggedIn: boolean) => {
this.isLoggedin = isLoggedIn;
}); }
}

home.component.html

<side-menu *ngIf='isLoggedin'></side-menu>
<top-bar *ngIf='isLoggedin'></top-bar>
<router-outlet></router-outlet>

auth.gaurd.ts

@Injectable()
export class AuthGaurd implements CanActivate{
constructor(private router : Router) {
}
canActivate(){
if (localStorage.getItem('isLogin')){
return true;
}
this.router.navigate(['/login'])
return false;
}
}

login.service.ts

@Injectable()
export class LoginService {
private subject: Subject<boolean> = new Subject<boolean>();
constructor(private router : Router) {
}
login(){
this.setLogged(true);
localStorage.setItem("isLogin","true");
this.router.navigate(['/news-feed']);
}
logout(){
this.setLogged(false);
localStorage.removeItem("isLogin");
this.router.navigate(['/login']);
}
getLogged(): Observable<boolean> {
return this.subject.asObservable();
}
setLogged(val : boolean): void {
this.subject.next(val);
}
}

login.component.ts

@Component({
selector: 'login',
moduleId: module.id,
templateUrl: 'login.component.html'
})

export class LoginComponent {
constructor (private loginService : LoginService) {
}

login(){
this.loginService.login()
}
}

login.component.html

<input type="number” #mobileNumber />
<input type="password" #password />
<input type="button" (click)="login()">

newsfeed.component.ts

@Component({
selector: 'newsfeed',
moduleId: module.id,
templateUrl: 'newsfeed.component.html',
})

export class NewsfeedComponent {

}

newsfeed.component.html

一些 html 文本....!!!!

应用路由.module.ts

@NgModule({
imports: [
RouterModule.forRoot([
{
path : 'login',
component : LoginComponent
},
{
path : 'news-feed',
component : NewsfeedComponent,
canActivate : [AuthGaurd]
},
{
path : '',
redirectTo : '/news-feed',
pathMatch : 'full'
}
{
path: '**',
component: LoginComponent
}
])
],
exports: [
RouterModule
]
})
export class AppRoutingModule {}

实际上,当我点击时它工作正常。就像它的启动完美比点击登录按钮转发到新闻源并显示预期结果。但是当我从浏览器 url 访问时,它不会从 home.html 加载侧边栏和顶部栏组件

最佳答案

我遇到了那个问题。这是我解决这种情况的方法;

  • 按照官方 Angular 文档中的说明创建具有可观察字段的共享服务
  • 在您的导航栏组件中,订阅来自共享服务的值以显示导航栏
  • 在登录和注销页面中,更新值。由于你已经订阅了该值,订阅者自己处理这种情况
  • 创建身份验证服务。添加一个类似于此的方法来询问您的后端,请求是否已通过身份验证;
//method parameters depend on what you want
isAuthorized(url: string, errorCallback: (any) => void) {
let body = JSON.stringify(url)
return this.http.post('account/isauthorized', body)
.map((response: Response) => {
//update value to display navigation bar if user is authenticated
yourSharedService.observableField.next(true);
return true;
})
.catch((response: Response) => {
errorCallback(response.status);
return Observable.of(false);
});
}
  • canActivatecanLoadCanActivateChild 中创建一个身份验证守卫并调用isAuthorized 方法。

  • 在您的回调中,处理未经授权的请求。您可以将用户重定向到错误页面或删除导航栏,以及任何您想要的。

希望对您有所帮助!

关于angularjs - Angular 2 : How to communicate from parent component to child?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40523579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com