angular - Angular 5:我们如何使用 routeroutlet 将数据从嵌套组件传递到父组件?
问题描述
设想
我要做的是从登录组件-> 应用程序组件发送数据。
下面是我的 login.component.ts 代码:
import { Component, OnInit, EventEmitter, Output, Input } from '@angular/core';
import { AuthService } from '../../services/auth.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
isUserAuthenticated: boolean = false;
@Output() valueChange = new EventEmitter();
constructor(private auth: AuthService) { }
ngOnInit() {
}
showMe() {
this.isUserAuthenticated = this.isUserAuthenticated == false ? true : false;
console.log('Log comming from login.component.ts: ' + this.isUserAuthenticated);
this.auth.login(this.isUserAuthenticated);
this.valueChange.emit(this.isUserAuthenticated);
}
}
auth.service.ts 代码:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class AuthService {
public isUserAuthenticated: boolean = false;
constructor() { }
login(params: boolean): Observable<boolean> {
this.isUserAuthenticated = params;
console.log('Log comming from auth.service.ts: ' + this.isUserAuthenticated);
return new Observable<boolean>(observer => observer.next(this.isUserAuthenticated));
}
}
app.component.ts 代码:
import { Component } from '@angular/core';
import { AuthService } from './services/auth.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
isUserAuthenticated: boolean = false;
title = 'app';
constructor(private auth: AuthService) {;
console.log('Log comming from app.component.ts: ' + this.auth.isUserAuthenticated);
this.isUserAuthenticated = this.auth.isUserAuthenticated;
}
showMe(value) {
console.log('Receiving data from login.component.ts: ' + value);
this.isUserAuthenticated = value;
}
}
app.component.html
<div class='container-fluid'>
<div class='row'>
<div class='col-sm-3'>
<app-nav-menu *ngIf="isUserAuthenticated"></app-nav-menu>
</div>
<div class='col-sm-9 body-content'>
<router-outlet (valueChange)="showMe($event)"></router-outlet>
</div>
</div>
</div>
问题
我面临的问题是我的@output 发射器功能this.valueChange.emit(this.isUserAuthenticated);
不起作用,并且没有达到这个showMe(value)
login.component.ts 中的这个功能。我不知道我在代码中做错了什么。请看看并帮助我。谢谢
我正在使用 Angular v5.2
解决方案
TLDR:使用服务并将其注入到两个组件中。
路由器出口另一侧的组件无法通过输出进行通信,因为它们在模板中不是父子关系。您只在模板中放置一个位置,路由器将动态实例化组件,因此输出是无用的,因为无法从模板访问它。
对于服务,它将是一个单例,这意味着两个组件在注入到它们之后都可以访问同一个实例。您可以使用它来传递数据、创建事件等。
推荐阅读
- c# - 具有 basicHttpBinding、传输安全性和基本客户端凭据类型的自定义 WCF 凭据验证器
- ios - 实施新的谷歌纸板
- java - 在 JAVA 中查找 JSON 字符串的深度
- javascript - 如何在选项卡内执行一些 JavaScript 代码以使用 chrome 扩展更改页面的某些内容?
- sql - SQLPlus 中行尾的注释
- r - 使用 R 逐行绘制条形图
- ubuntu - 重启时Fail2ban禁止IP消失
- javascript - 无法从子类访问父类属性 - Javascript
- javascript - 从数字数组生成对象,其中值将是随机颜色
- r - 如何在 r 中将栅格添加到很好地覆盖土地并且没有间隙的传单地图?