在实际的开发中两个组件之间不一定有着强关联。(这里说的强关联指的是父子关系,或者是兄弟关系。)所以我们不能使用对应的策略:
- 父传子 通过@Input
- 子传父 通过@Output
- 兄弟关系通过寻找他们共同的父亲,然后通过子到父在通过父到子之间传递。
但要是没有对应的关联怎么办呢?
今天偶然习得,所以就分享一下。可以通过将关联这两个关系的逻辑方法抽到一个service中,然后在service中定义一个EventEmitter(这个类在之前@Output中有提到过),在事件的触发点进行发射,在处理的地方进行接收即可,简单来说就是起到一个承上启下的作用。
有可能这么说比较抽象,下面举一个简单的例子。
我们一共有两个component:
- search
- product
需要的功能是这样的:search组件会根据用户输入的查询条件,通过请求后台,将结果显示在component界面上。因为他们都有使用productService,可以这就是个"中间人"。
看一下productService的代码:
//这个就是那个中间人,EventEmitter中的泛型指代的是查询条件
event: EventEmitter<object> = new EventEmitter();
//这是请求后台的方法
public getProductsByCondition(requestBody: object): Observable<any> {
return this.http.post('/api/products/condition', requestBody);
}
看一下提交用户查询条件的方法:
onSearch() {
//这个是检验表单的字段是否合法
if (this.formModel.valid) {
console.log(this.formModel.value);
//使用那个中间人,发送一个事件
this.productService.event.emit(this.formModel.value);
}
看一下订阅事件,并且更新product列表显示的地方
//订阅了那个中间人,并且更新商品列表。
this.productService.event.subscribe(params => {
this.productList = this.productService.getProductsByCondition(params);
});
梳理一下:主要的思想是将查询条件进行了传递,然后在需要更新的组件中,发送请求,并更新界面。