angular - 如何在 Angular 中的未嵌套组件之间设置或传递属性状态
问题描述
我使用技术 Angular 开发了一个 Web 应用程序。但是现在我遇到了一个问题,如何将一个组件中的属性传递或设置到另一个组件,这些组件不是父子组件。
详细信息:我创建了一个名为 Serach 的组件,该组件中有一个按钮,如果单击此按钮,将调用一些 REST API 并等待从后端获取一些数据。通过调用这个 REST CALL,将在另一个名为 Home 的组件中显示 'LOADING....'。
组件 Search 和组件 HOME 不是父子组件。并且 Search 组件位于 Header 组件中,如果加载了 Web 应用程序,则会显示 Home 组件。这意味着,这两个组件同时显示。
我曾尝试使用消息服务来传输消息,例如“加载”。
<mat-sidenav-content>
<div class="app-header">
<app-header></app-header>
</div>
<div class="mat-sidenav-content">
<main class="content">
<app-breadcrumb></app-breadcrumb>
<router-outlet></router-outlet>
</main>
</div>
</mat-sidenav-content>
搜索组件位于应用程序头组件中。
serach 组件中的功能如下:
public search(): void {
this.messageService.sendMessage("LOADING");
this.loadData.loadData(this.key).subscribe(() => {
this.router.navigate(['overview']);
}
, (error) => {
this.openDialog();
}
);
}
home.ts 中的代码
export class HomeComponent implements OnInit {
public message = [];
subscription: Subscription;
constructor(private messageService: MessageService,
private router: Router) {
this.subscription = this.messageService.getMessage().subscribe((message) => {
this.message.push(message);
});
}
ngOnInit() {
}
}
和 HTML 代码:
<div *ngIf="message.includes('LOADING')">
<app-loading></app-loading>
</div>
有人有什么想法吗?
解决方案
要在没有父子关系的两个组件之间共享数据,您将使用您解释的服务。MessageService
如果没有看到您的实施,很难说出问题所在。
我确实整理了一个简单的示例,您可以查看并应用于您的情况。下面的链接是一些资源,可帮助解释 Angular 组件交互和 stackblitz 示例,其中我创建了一个LoadingService
类似于如何创建的示例,MessageService
类似于此...
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class LoadingService {
private isLoadingSource: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
public isLoading: Observable<boolean> = this.isLoadingSource.asObservable();
constructor() { }
set loading(value: boolean) {
this.isLoadingSource.next(value);
}
}
资源
https://stackblitz.com/edit/angular-gjpsgi
https://angular.io/guide/component-interaction
https://angularfirebase.com/lessons/sharing-data-between-angular-components-four-methods/
推荐阅读
- java - RxJava call the network when database is empty
- angularjs - One way binding doesn't work in AngularJS with setInterval
- javascript - Sequelize Deprecated Error Message when running migration
- angular - Angular 5 HttpClient 无法填充变量文本
- java - 如何为 KeyPair 生成生成确定性 SecureRandom?
- javascript - 如何将 PhantomJS 添加到我的 Chrome 扩展程序中?
- ios - Background color of UIView defaults to black, trying to change programmatically in swift 4
- sql - 将 MS Access 查询转换为 SQL Server 查询
- video - ffmpeg - 如何在保留总帧数的同时缩放视频?
- javascript - D3 v4 Scatterplot chart data points are not updating on zoom