Angular 6 / Typescript

时间:2018-06-11 00:41:24

标签: angular typescript events

我有以下结构:

<app>
  <test-a></test-a>
  <test-b></test-b>
</app>

@Component({
    selector: 'app',
    templateUrl: './app.component.html',
})
export class AppComponent {
}    

@Component({
    selector: 'test-a',
    templateUrl: './testa.component.html',
})
export class TestAComponent {
}

@Component({
    selector: 'test-b',
    templateUrl: './testb.component.html',
})
export class TestBComponent {
}

Test B包含可选项。当选择一个时,我想告诉测试A该项目已被选中......

我认为我知道有两个选项可以实现这一目标。

  • 使用App存储所选项目。修改Test B中的所选项目,然后允许Test A作出反应...但它会在Test ATest B之间产生丑陋的紧密耦合 components ...和父App组件。我不喜欢这个主意。
  • 创建某种“事件订阅者”服务,该服务存储可以订阅的各种Observable数组。我目前的实施(未完成):

//我自己的班级所需的模型

export class KeyValuePair<T>
{
    public key: string;
    public value: T;

    construct(key: string, value: T) {
        this.key = key;
        this.value = value;
    }
}

//我的实现看起来如何(wip)

import { Observable, of } from "rxjs";
import { KeyValuePair } from "../models/keyvaluepair";
import { Injectable } from "@angular/core";

@Injectable({
    providedIn: 'root',
})
export class EventService<T>
{
    protected subscriptions: KeyValuePair<Observable<T>>[];

    public Broadcast(key: string, value: any)
    {
        var observable = new Observable<T>();
        observable.subscribe((a) =>
        {
            return of(value);
        });

        this.subscriptions.push(
            new KeyValuePair<Observable<T>>(
                key, 
                observable
            )
        );
    }

    public Subscribe(key: string): Observable<T>
    {
        var observable = this.subscriptions.find((sub) => {
            return sub.key == key;
        });

        return observable.value;
    }
}

//如何创建活动

this.testEventService.Broadcast("itemSelected", item);

//如何使用

this.testEventService.Subscribe("itemSelected").subscribe((item) => {
    this.changeItem(item);
});

但是,我当然不应该写这些东西..?在angularjs和jquery中有一个$ broadcast和$ on的东西让生活如此简单......我在这里缺少什么?在角度6和打字稿中有更简单的方法吗?

修改

我已经提供了人们可以使用的服务,请告诉我它是否很糟糕:https://jsfiddle.net/jimmyt1988/oy7ud8L3/

1 个答案:

答案 0 :(得分:3)

您可以使用Subject

{{1}}