如何根据Angular中的一个组件中的点击事件更改其他组件中的数据?
我是Angular的初学者,我开发了一个由5个组件组成的角4/5应用程序:A,B,C,D和E.所有这些组件都显示在单个(相同)页面上。组件A由导航栏中的下拉列表组成。现在,我要做的是,在组件A的下拉列表中选择任何特定选项后,我必须同时更改其他组件B,C,D和E的数据。如何根据Angular中的一个组件中的点击事件更改其他组件中的数据?
我非常困惑如何实现这种数据绑定。任何人都可以帮助如何实现这一目标?
由于发布整个代码将是一个非常困难的任务,因为我有大约二十个文件,所以我发布了组件A,组件B和根组件的代码。
组分A码,其中组分A是导航栏
导航bar.component.html:
<div class="container model-family-navigation-bar"> <nav class="navbar navbar-expand-sm navbar-dark model-family-navigation-bar">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<!-- <div class="col-sm-auto"> -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle navigation-bar-content text-white" href="#" id="navbarDropdown" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span id="selected">Model Family</span>
</a>
<div class="dropdown-menu bg-success table-striped" aria-labelledby="navbarDropdown">
<h1 class="dropdown-header text-white">Select Model Family</h1>
<div *ngFor="let item of dropdownElements">
<div class="dropdown-divider"></div>
<a class="dropdown-item" (click)="showList()">{{item.model_family}}</a>
</div>
</div>
</li>
<!-- </div> -->
<!-- <div class="col-sm-auto"> -->
<li class="nav-item">
<span class="navigation-bar-content navbar-text text-white ml-4">Proportional Directional Valve</span>
</li>
<!-- </div> -->
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item navbar-right">
<a class="nav-link text-white" href="https://www.google.com/">Data Sheet</a>
</li>
</ul>
</div>
</nav>
</div>
导航bar.component.ts:
import { Component, OnInit } from '@angular/core'; import {NavigationDropdownElements} from './navigation-bar-dropdownElements'
@Component({
selector: 'navigation-bar',
templateUrl: './navigation-bar.component.html',
styleUrls: ['./navigation-bar.component.css']
})
export class NavigationBarComponent implements OnInit {
dropdownElements = NavigationDropdownElements;
ngOnInit() {}
}
导航-BAR-dropdownElements.ts
class NavigationDropdown{ model_family: string;
}
export const NavigationDropdownElements: NavigationDropdown[] = [
{ model_family: 'CP210-1'},
{ model_family: 'CP211-2'},
{ model_family: 'CP212-3'}
];
组分B的代码,其中组分B是模型家庭描述
模型家庭description.component.ts:
import { Component, OnInit } from '@angular/core'; import { descriptionElements1, descriptionElements2 } from './model-family-description-elements';
@Component({
selector: 'model-family-description',
templateUrl: './model-family-description.component.html',
styleUrls: ['./model-family-description.component.css']
})
export class ModelFamilyDescriptionComponent implements OnInit {
desc1 = descriptionElements1;
desc2 = descriptionElements2;
constructor() { }
ngOnInit() {
}
}
model-family-description.component.html
<div class="container border-section"> <div class="row">
<p class="ml-2">{{desc2.description}}</p>
</div>
</div>
模型家庭描述-elements.ts
class ModelFamilyDescription { description: string;
}
export const descriptionElements1: ModelFamilyDescription =
{ description: 'This is a proportional, 3 position 4 way, directional control valve.' };
export const descriptionElements2: ModelFamilyDescription =
{ description: 'This is a proportional, 4 position 5 way, non-directional control valve.' };
根组件:
app.component.html:
<navigation-bar></navigation-bar> <model-family-description></model-family-description>
app.component.ts :
import { Component } from '@angular/core'; @Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
}
请帮忙。
回答:
应创建一个共同@Injectable
与Subject
实施例:
@Injectable() export class CommonService {
private dropdownValue: Subject<string> = new Subject();
public getDropdownValue() : Observable {
return this.dropdownValue.asObservable();
}
public setDropdownValue(value: string) : void {
this.dropdownValue.next(value);
}
然后,在组分A:
constructor( private commonService: CommonService
) {
...
}
protected onDropdownChange(value: string) : void {
this.commonService.setDropdownValue(value);
}
而在其它组分:
constructor( private commonService: CommonService
) {
this.commonService.getDropdownValue().subscribe((newValue) => {
// action on data change
});
}
回答:
有两种方法可以使用EventEmitter或使用主题 我更喜欢主题。
例如: 可以LIB http://reactivex.io/rxjs/file/es6/Subject.js.html#lineNumber19 如果您想了解更多关于EventEmitter https://angular.io/api/core/EventEmitter
回答:
首先创建一个服务是不是不像EventEmitter 的角度实施的功能了解更多关于主题从rxjs的文档:
message.service.ts
import { Injectable } from '@angular/core'; import { Observable } from 'rxjs';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class MessageService {
private subject = new Subject<any>();
sendMessage(message: string) {
this.subject.next({ text: message });
}
clearMessage() {
this.subject.next();
}
getMessage(): Observable<any> {
return this.subject.asObservable();
}
}
然后该服务添加到app.module.ts
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { MessageService } from './message.service';
@NgModule({
imports: [
BrowserModule,
FormsModule,
ModalModule.forRoot()
],
declarations: [
AppComponent
],
providers: [
MessageService
],
bootstrap: [
AppComponent
]
})
export class AppModule { }
现在你需要导入服务在您想从发送数据(A成分在你的情况下)的组件
类似:
import { Component, OnInit } from '@angular/core'; import {NavigationDropdownElements} from './navigation-bar-dropdownElements'
import { MessageService } from './message.service';
@Component({
selector: 'navigation-bar',
templateUrl: './navigation-bar.component.html',
styleUrls: ['./navigation-bar.component.css']
})
export class NavigationBarComponent implements OnInit {
dropdownElements = NavigationDropdownElements;
constructor(private messageService: MessageService) {}
sendMessage(data:string): void {
// send message to subscribers via observable subject
this.messageService.sendMessage(data);
}
showList() {
//on a click, you send the message here
let message:string="data example";
this.sendMessage(message);
}
clearMessage(): void {
// clear message
this.messageService.clearMessage();
}
ngOnInit() {}
}
而finaly你必须导入服务要阅读信息或数据的组件从第一组件(例如组分B)
像接受:
import { Component, OnInit, OnDestroy} from '@angular/core'; import { descriptionElements1, descriptionElements2 } from './model-family-description-elements';
import { Subscription } from 'rxjs/Subscription';
import { MessageService } from './message.service';
@Component({
selector: 'model-family-description',
templateUrl: './model-family-description.component.html',
styleUrls: ['./model-family-description.component.css']
})
export class ModelFamilyDescriptionComponent implements OnInit {
//you receive the data in this variable --> message
message: any;
subscription: Subscription;
desc1 = descriptionElements1;
desc2 = descriptionElements2;
constructor(private messageService: MessageService) {
}
ngOnDestroy() {
// unsubscribe to ensure no memory leaks
this.subscription.unsubscribe();
}
ngOnInit() {
// subscribe to component A messages
this.subscription = this.messageService.getMessage().subscribe(message => { this.message = message; });
}
}
回答:
您需要发出下拉选项组件A的更改
然后使用设置器方法接收组件B和C的更改。 安装程序方法总是在期间被调用,更新值为。
入住这里:https://stackblitz.com/edit/angular-dshm6g
您还可以使用可观察的模式从rxJs来解决这类问题。
以上是 如何根据Angular中的一个组件中的点击事件更改其他组件中的数据? 的全部内容, 来源链接: utcz.com/qa/265143.html