【问题标题】:RxJS observe an objectRxJS 观察一个对象
【发布时间】:2016-12-22 03:40:43
【问题描述】:

我是 RxJS 的新手,所以对于新手的问题,我深表歉意。

我有一个本地 javascript 对象定义为:

model.user = {
  firstName: 'John',
  lastName: 'Smith'
}

我将每个属性绑定到一个输入控件,用户可以在其中更改值。我希望能够观察这个对象并在任何属性的值发生变化时捕获事件。

这可以通过 RxJS 实现吗?

谢谢。

【问题讨论】:

  • 谢谢@OlesSavluk。你知道这是否适用于嵌套属性?
  • 不确定,在后台它使用Object.observe。另请注意,大多数浏览器都不支持它。
  • 谢谢,我去看看。
  • @OlesSavluk。你是对的,这并不适用于所有平台。 Object.observe() 不再可用。搜索继续……

标签: rxjs


【解决方案1】:

您可以将整个状态存储为 Observable,而不是使用对象。

这是示例代码(类似于人们在 redux 中所做的):

var fnameInput = document.getElementById('fname');
var lnameInput = document.getElementById('lname');
var jsonPre = document.getElementById('json');

var onFirstName$ = Rx.Observable.fromEvent(fnameInput, 'input');
var onLastName$ = Rx.Observable.fromEvent(lnameInput, 'input');

var initialState = {
  firstName: '', 
  lastName: '',
};

var state$ = Rx.Observable
  .merge(
    onFirstName$
      .map(e => 
        state => Object.assign(
          state, 
          { firstName: e.target.value }
        )
      ),
    onLastName$
      .map(e => 
        state => Object.assign(
          state, 
          { lastName: e.target.value }
        )
      )
  )
  .scan(
    (state, makeNew) => makeNew(state), 
    initialState
  )
  .startWith(initialState);

state$
  .subscribe(state => {
    jsonPre.innerHTML = JSON.stringify(state, null, 2);
  });
<input id="fname" type="text">
<input id="lname" type="text">
<pre id="json"></pre>

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>

【讨论】:

  • 我有一个问题,你从哪里得到变量“state”?在两个 Observables 中使用 Object.assign() 更新的那个
  • @Borjante 它由scan 方法处理,从initialValue 开始,然后通过将makeNew 函数应用于旧状态来创建下一个状态。见 - github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/…
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2020-08-28
相关资源
最近更新 更多