Non sono sicuro se pertinente o se aiuta qualcuno: mi sono imbattuto in un problema simile: volevo utilizzare una proprietà di tipo Observable<number>
fornita da un componente nel componente principale.
Dopo aver letto Observables and Reactive Programming in Angular 2, ho notato che ho bisogno di "girare" intorno alla mia architettura e lasciare che il genitore crei il Observable
e quindi assegnarlo al figlio.
Così, invece di avere un MyComponent
con @Output()
di tipo Observable<number>
(che è stato poi inizializzato a new BehaviorSubject(0)
e modificato utilizzando chiamate a next
), ho cambiato MyComponent
di rifugio un @Input()
di tipo BehaviorSubject<number>
:
@Component({
selector: 'my-component',
template: `
<button (click)="increment()">Click me!</button>
`,
})
export class MyComponent {
private _count : number = 0;
@Input()
public counter : BehaviorSubject<number>;
public increment() {
this._count++;
if (this.counter)
this.counter.next(this._count);
}
}
L' genitore ora crea un oggetto BehaviorSubject e si lega alla proprietà. Si può facilmente consumare il BehaviorSubject come osservabile:
@Component({
selector: 'my-app',
template: `
<my-component [counter]="count"></my-component>
<span>{{text | async}}</span>
`,
})
export class App {
public text : Observable<string>;
public count : BehaviorSubject<number> = new BehaviorSubject(0);
constructor() {
this.text = this.count.map(n => "Click: " + n);
}
}
Plunker: https://plnkr.co/edit/rKtVWmmGnFn4Po4B4CCL?p=preview
Quindi nel tuo caso, vorrei dire che il vostro cursore dovrebbe fornire un @Input
(forse lo chiamano valore o numero) e lasciare che il il genitore assegna un osservabile (invece di lasciare che il bambino ne crei uno).
Si può fare '(change) =" myOutput.emit ($ event) "'. Supponendo che ti ho capito correttamente. –
Ciò mi risparmierebbe il boilerplate del callback (ottimo). Dovrei ancora copiare da un soggetto a quello successivo. –
È possibile inserire EventEmitter in un servizio, chiedere al componente di chiamare un metodo API/sul servizio per attivare/'emit()' l'evento e tutti gli utenti verranno avvisati. Quindi nessuna copia. Ecco [un esempio] (http://stackoverflow.com/questions/34376854/delegation-eventemitter-in-angular2/34402436#34402436). –