У меня такая структура:
<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, что этот элемент был выбран ...
Я думаю, что есть 2 варианта, которые, как я знаю, могут достичь этого.
App для сохранения выбранного элемента. Измените этот выбранный элемент в Test B, а затем позвольте Test A реагировать ... но он создает уродливая тугая связь между компонентами Test A и Test B ... и родительским компонентом App. Мне не нравится эта идея.// Модель, необходимая для моего собственного класса
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, которые сделали жизнь такой простой ... что мне здесь не хватает? Есть ли более простой способ в angular 6 и машинописном тексте?
Редактировать:
Я сделал сервис, которым могут пользоваться люди, скажите, отстойно ли это: https://jsfiddle.net/jimmyt1988/oy7ud8L3/





вы можете использовать Предмет
export class EventService<T> {
protected _eventSubject = new Subject();
public events = this._eventSubject.asObservable();
dispathEvent(event) {
this._eventSubject.next(event);
}
}
и вы можете использовать eventService.events.subscribe(event => {...}) и eventsService.dispatchEvent(event)
как бы выглядело событие в этом случае?
О, понятно, это всего лишь одноразовая вещь? как мне назначить ему ключ? чтобы я мог хранить разные события с разными данными?
все, что вы хотите, в вашем случае вы можете использовать что-то вроде redux Action - { action: 'itemSelected', payload: {} }
вы также можете создавать селекторы различий из этой темы public itemSelectedEvents = this.events.pipe( filter(e => e.action === 'itemSelected'), map(e => e.payload) )
"чтобы я мог хранить разные события с разными данными?" - Да, ты можешь.
Спасибо за помощь. Я попробую, когда вернусь с работы, и поставлю вам галочку, когда заставлю работать. Спасибо чувак!
Спасибо, я тоже читал по предметам. идеальный выбор для работы. Странно, что для этого нет готового сервиса. пришлось создать все самому :(
Я добавил свою последнюю реализацию службы в OP. Спасибо за вашу помощь.
вот моя реализация для этой службы jsfiddle.net/izmaylovdev/3ybxwuas/13
Понятно, в субъекте может быть несколько объектов. Хорошо знать! Спасибо. Большое спасибо, чувак!
Думаю, вы можете упростить, могу помочь, если вам интересно.