Javascript 订阅阵列更改

Javascript 订阅阵列更改,javascript,rxjs,Javascript,Rxjs,我试图在使用jQuery的现有项目中使用RxJS。每次单击按钮时,都会向用户推送一个新值。如何在(用户)的中查看对用户的更改。订阅(…) 你好 常数{of}=rxjs 让用户=[ {a:“b”} ] 共(个用户)。订阅(数据=>{ console.log(数据) }) jQuery(document).on('click','hello',函数(){ push({c:'d'}) }) 使用RxJSscan操作符,可以将流转换为不同的形式,类似于JavaScript的原生.reduce()方法的工

我试图在使用jQuery的现有项目中使用RxJS。每次单击按钮时,都会向
用户
推送一个新值。如何在(用户)的
中查看对
用户的更改。订阅(…)

你好 常数{of}=rxjs 让用户=[ {a:“b”} ] 共(个用户)。订阅(数据=>{ console.log(数据) }) jQuery(document).on('click','hello',函数(){ push({c:'d'}) })
使用RxJS
scan
操作符,可以将流转换为不同的形式,类似于JavaScript的原生
.reduce()
方法的工作方式。在本例中,每当您想要“推送”到users数组时,您可以简单地发出newUser主题上的另一个用户

// Create a new subject
const newUser = new Subject();

// Use scan to add new users into array of users
const users = newUser.pipe(scan((acc, user) => [ ...acc, user ], []));

// Subscribe to the list of users and log
users.subscribe(data => console.log(data));

// Add new user to array on document click
jQuery(document).on('click', '.hello', () => users.next({ c: 'd' }));

或者,您可以将新的ES6代理类与Subject一起使用


一种方法是使用
BehaviorSubject

因此,对于您的案例,请编写以下内容:

const users$ = new BehaviorSubject([{ a: 'b' }]);

users$.subscribe((users) => {
  console.log(users);
});

jQuery(document).on('click', '.hello', function() {
  const users = [...users$.value]; // write like this so that array stays immutable
  users.push({ a: 'd' });
  users$.next(users);
});
使用
BehaviorSubject
可以获得当前值:
users$.value


users$.next(users)
事件将被发出,并且
console.log(users)
将发生在subscribe内部

可观察对象可以使用数组作为输入,但它不能像这样“侦听”它。创建一个可观察的对象,该对象监听按钮的点击-这是(用户)的可观察对象的主要用例之一。不监视数组的更改,它只提供数组当前状态的单个值流。您可能需要查看“fromEvent”rxjs操作符
let usersUpdate=new Subject()
let users = [
  { a: "b" }
]

usersUpdate.subscribe(data => {
  console.log(data)
})

let users=new Proxy([{ a: "b" }],{
set:(obj, prop, newval)=>{
    obj[prop] = newval
    userUpdate.next({obj, prop, newval})
    return true
   }
})

users.push('item')
const users$ = new BehaviorSubject([{ a: 'b' }]);

users$.subscribe((users) => {
  console.log(users);
});

jQuery(document).on('click', '.hello', function() {
  const users = [...users$.value]; // write like this so that array stays immutable
  users.push({ a: 'd' });
  users$.next(users);
});