【问题标题】:Create an observable from a plain object从普通对象创建一个可观察对象
【发布时间】:2017-08-16 16:40:47
【问题描述】:

我对 RxJS 很陌生,所以如果已经回答了这个问题,我提前道歉。

我有一个 Angular 2 应用程序,并且在其中一个组件中我有一个普通对象。我将 UI 绑定到这个对象。我想做的是能够捕获对此对象的所有更改,无论它们来自代码还是来自更改某个字段的用户。

我正在查看 observable 对象,但似乎只有在通过 Emit 方法推送新对象时订阅者才能收到通知。例如,在属性绑定到输入字段的情况下,这将如何工作?

有更好的方法吗?

我的代码如下所示:

export class MyComponent {
  app: ApplicationModel = new ApplicationModel(); <--- this is the object I want to track
  
  constructor(api: APIService) {
    api.getApplication().then((data) => {
      this.app = data; 
    });
  }
}

我正在寻找类似于 Knockout 允许您接收更改通知的方式:

myViewModel.personName.subscribe(function(newValue) {
    alert("The person's new name is " + newValue);
});

谢谢。

【问题讨论】:

  • 我不这么认为。在我的情况下,对象是在组件本身中创建的,它不是通过 @Input 导入的
  • 你走错了路,因为这无法做到。这就是 Angular 依赖可观察对象并拥有所有这些输入的原因。
  • 随着Object.observe() 的去世,这很难做到。最好是正确地做到这一点并使用不可变对象并通过可观察对象发出对象的每个新版本。
  • 是的,这可能会有所帮助。或者 ApplicationModel 可以公开 observable(s) 并通过 prop getter/setter 向它们推送值。这取决于它的使用方式。

标签: angular rxjs


【解决方案1】:

无论是在使用@Input 或只是跟踪服务甚至同一组件的更改时,您都可以使用BehaviorSubject

import { BehaviorSubject } from 'rxjs/BehaviorSubject';

appModel = new BehaviorSubject(new ApplicationModel());

推动新的变化:

appModel.next(applicationModelModified);

订阅新更改:

appModel.subscribe(val => ...)

随时读取值:

appModel.value

【讨论】:

  • 谢谢@zurfyx。这将如何与绑定到 UI 元素(例如输入)的属性一起使用?我还需要手动调用下一个方法吗?
  • @dpdragnev 因为BehaviorSubject 的工作方式,是的。我不确定是否有更直接的选择。但是,对于元素组(如表单),您可能希望监听影响任何组的更改(即this.myForm.valueChanges.subscribe)并在处理完它们后推送更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2018-03-04
相关资源
最近更新 更多