おそらく、変更検出に関するAngular2の概念が欠けています。
NgZones と ChangeDetectionStrategy について読んだことがありますが、問題を解決できるものはありませんでした。
Observables を保存して一部のコンポーネントでそれらを消費する外部モジュールがある場合、コンポーネントの 1 つがサービスに何かを変更すると、それが他のコンポーネントに伝播します。
問題を表現するのに役立つPlunkerを書きました
http://plnkr.co/edit/ieHnm0ikBe4BR5w6O1XE?p=preview
そこには、を使用して一定のデータ変更をsrc/MyService.ts
シミュレートする場所があります。Subject
setInterval
はSubject
で消費され、src/app.ts
その値は空のクリック ハンドラーでボタンをクリックしたときにのみレンダリングされます。
src/MyService.ts
import * as Rx from 'rxjs/Rx';
let global = {};
// The Observable
global.subject = new Rx.Subject();
// Updates value every second
setInterval(() => global.subject.next(Date.now()), 1000);
export var Global = global;
src/app.ts
import {Component} from 'angular2/core'
import {Global} from './myService'
@Component({
selector: 'my-app',
providers: [],
template: `
<div>
<h2>Hello {{name}}</h2>
<button (click)="clickMe()">Click me</button>
<p>Current time: {{subject | async}}</p>
</div>
`,
directives: []
})
export class App {
public subject = Global.subject;
constructor() {
this.name = 'Angular2'
}
public clickMe () {
console.log("I'm just a click event that do nothing");
}
}