Ionic 3 中的事件和 Angular "Rxjs" 中的 BehaviorSubject 在订阅事件发出方面有什么区别,例如,"当某个事件发生时,全局发出它"?
要理解 BehaviorSubject,有必要花时间消化 Subjects 的工作原理以及它们与普通可观察对象的区别。
Per Ben Lesh(Rxjs的主要贡献者):"Subject和Observable之间更重要的区别是,Subject有状态,它保留了一个观察者列表。
因此,主体保留状态。为了进一步阅读,我鼓励您阅读"热"可观察量和"冷"可观察量之间的区别。
行为主体与主体的不同之处在于,订阅它的任何使用者都将立即向其发出行为主体的最新值。
因此,假设我们有一个应用程序,它有一个发出当前用户用户名的行为主题。假设我们的主页组件订阅了此行为主题。一旦该订阅初始化(在主页中),用户名值就会被发送到它。时间流逝,仍然有相同的用户登录。Say DetailsPage 现在才订阅了相同的 BehaviorSubject。在此期间,用户名未更改,但无论如何,初始化此新订阅时,将发出该值。
据我所知,事件(在 Ionic 中)用于订阅和广播全球事件。行为主体可以是任何范围,通常不是全局的。
我想说的是,主题与事件更接近。主题可以推送到它的值(如事件已发布),也可以像事件一样订阅。
尽管同样,主题通常不受任何范围的约束。也就是说,它并非设计为始终在应用的全局范围内使用。
两者之间有一些区别,但我认为这里有 3 个值得关注。
行为主体在你订阅它时发出他的"事件"。
因此,如果您创建一个新的 BehaviorSubject 实例并订阅,即使您没有使用next()
,它也会执行其中的代码,如下所示:
var subject = new Rx.BehaviorSubject(0); // 0 is the initial value
subject.subscribe((value) => {
// this code will fire when you subscribe to this new subject, then'll fire again for every next(value) you call
console.log('observerA: ' + value);
});
事件只会在您使用 是.publish()
方法时触发。
行为主体不是全球性的。
由于您需要在组件中创建它的新实例并订阅它,因此它仅适用于此组件。使用 Events,您始终可以从任何组件订阅和发布,因为发布和事件时的第一个参数是标识符,对此标识符的任何订阅都将在您发布时触发。
BehaviorSubject 存储传递给它的最后一个值。
您可以随时使用主题getValue()
方法来获取传递给它的最后一个值。使用事件是不可能的,但您可以创建一个变量,每次发布事件时,此变量都会保存传递的值。
希望这有帮助。