[英]filter a single value with RxJS in and return an observable and use the observable via async in a template in Angular
[英]how to use rxjs / angular observable to publish a value
我在玩 ionic(建立在 angular 之上的框架),我對 rxjs 的 Observable 模式有點困惑。 我有以下情況:
我有類似以下代碼的內容,但是在 MyApp 中進行訂閱時出錯。 我很難找到如何從 MyApp 發布新值。 我相信正常的過程是在創建 Observable 時使用回調函數。
有人能指出我正確的方向嗎?
@Injectable()
export class DataProvider {
numbers: Observable<number>;
constructor(public http: HttpClient) {
this.numbers = new Observable<number>();
}
get_n_messages()
{
return this.numbers;
}
}
@Component({
templateUrl: 'app.html'
})
export class MyApp {
subscription: any;
constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, oneSignal: OneSignal, dataCtrl: DataProvider) {
this.subscription = dataCtrl.get_n_messages().subscribe( x => {});
}
private onPushReceived(payload: OSNotificationPayload) {
alert('Push recevied:' + payload.body);
this.subscription.next(666);1
}
}
使用 rxjs主題
這是一個例子
@Injectable()
export class DataProvider {
numbers: new Subject<number>();
constructor(public http: HttpClient) {
}
}
並在.ts
@Component({
templateUrl: 'app.html'
})
export class MyApp {
constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, oneSignal: OneSignal, dataCtrl: DataProvider) { }
private onPushReceived(payload: OSNotificationPayload) {
alert('Push recevied:' + payload.body);
this.dataCtrl.numbers.next(666);
}
ngOnInit() {
this.dataCtrl.numbers.subscribe(res => {
console.log(res);
});
}
}
使numbers
成為BehaviorSubject<number>
而不是Observable<number>
。 BehaviorSubjects 既可以用作 Observer 也可以用作 Observable。
所以如果你想向它推送新值,你可以調用它的next
方法並傳遞新值。
此 BehaviorSubject 的偵聽器/訂閱者將獲得新值。
所以這里是你必須做的改變:
到您的數據提供者
@Injectable()
export class DataProvider {
numbers$: BehaviorSubject<number> = new BehaviorSubject<number>(0);
}
和你的組件:
@Component({
templateUrl: 'app.html'
})
export class MyApp {
subscription: any;
newNotificationCount;
constructor(
platform: Platform,
statusBar: StatusBar,
splashScreen: SplashScreen,
oneSignal: OneSignal,
dataCtrl: DataProvider
) {
this.subscription = this.dataCtrl.numbers$.subscribe(newNotificationCount => this.newNotificationCount = newNotificationCount);
}
private onPushReceived(payload: OSNotificationPayload) {
alert('Push recevied:' + payload.body);
this.dataCtrl.numbers$.next(666);
}
}
雖然,由於值是在同一個控制器中更新的,我真的認為不需要這樣的 DataProvider 服務。 但是,如果您還想在其他地方顯示 notificationCount 並希望始終保持計數一致,那么這就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.