javascript - 如何观察 RxJS 中的属性变化?

标签 javascript angularjs rxjs

我对 RxJS 的经验不多,但我想知道是否有一种方法可以订阅对象属性的变化? 我正在使用 RxJS 5。我使用 BehaviorSubject 将新值推送给订阅者。该主题包含一个对象,该对象定义了一些应用程序设置。

所以,我想做的是,我希望应用程序组件在特定属性更改时订阅并获取新值。 或者,我希望 observable 为每个订阅者生成对象的副本 - 这样他们就没有对原始对象的引用。

我的问题类似于this one .

提供应用设置的服务:

app.factory('settingsProvider', ['$rootScope', function ($rootScope) {

    let subject = new Rx.BehaviorSubject();

    let updateSettings = function (obj) {

        subject.next(_.merge({}, subject.getValue(), obj));
    };

    return {

        updateSettings: updateSettings,
        getObservable: function () {

            return subject.asObservable();
        }
    };
}]);

在某些指令中,我想订阅对某些属性的更改。 我目前有这个:

let settings = {};
let settingsSubscription = settingsProvider.getObservable().subscribe(x => settings = x);

最佳答案

我相信您需要运算符 distincthttps://rxjs-dev.firebaseapp.com/api/operators/distinct

这是一个老问题,所以我将提供 v6 语法并假设您已同时更新。这个概念没有改变,所以您可以在 v5 中应用这种方法。

您犯的大错误是强制将 settings 重新分配为闭包。 Observable 以流的形式工作得最好,您可以将一个 observable 传输到下一个并且没有副作用。如果我们假设您开始观察正在构建它的东西,例如 { foo: 1, bar: 2, baz: 3},我们可以先映射我们想要的 Prop ,然后distinct 以确保我们只在更改时发出。

const fooUpdate$ = mySub$
  .pipe(
    .map(({ foo }) => foo)
    .distinct()
  );

fooUpdate$.subscribe(val => console.log(val));

// Example of testing it
mySub$.next({ foo: 1, bar: 2 });
mySub$.next({ foo: 1, bar: 3 });
mySub$.next({ foo: 2, bar: 4 });
mySub$.next({ foo: 2, bar: 5 });
mySub$.next({ foo: 2, bar: 5 });
mySub$.next({ foo: 3, bar: 2 });

// 1, 2, 3

关于javascript - 如何观察 RxJS 中的属性变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45673990/

相关文章:

angularjs - 如何在禁用 ng 的情况下使用 ng-if

javascript - RxJS,如何轮询 API 以使用动态时间戳持续检查更新的记录

javascript - 为什么要使用 observables 而不是 Ajax?

javascript - JavaScript 中匿名函数的作用域问题

javascript - Jquery:过滤按键输入

javascript - Angular Material - 图像上的元素叠加(在 md-card 中)

javascript - 具有双 y 轴的 Angular NVD3 Multibar Chart 使用 json 数据仅显示线

javascript - 为什么 "undefined"在 Angular JS 中显示?

rxjs - 如何取消来自许多角度 8 的待处理 http 请求之一

javascript - WordPress 定制器链接自 WP5.8 更新后停止工作