Intro to Rx

An example of a "Who to follow" suggestions box built with the Reactive Programming library RxJS.

HTML

<div class="container">
    <div class="header">
         <h2>Type</h2>
         <div> Input1 (fires 2 times)<br>
         <input class="input1"/>
         </div>
         <div>
         Input2<br>
         <input class="input2"/>
         </div>
         
<script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.26/rx.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.26/rx.async.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.26/rx.coincidence.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.26/rx.binding.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.26/rx.time.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs-dom/2.0.7/rx.dom.js"></script>

CSS

body {
    font-family: sans-serif;
    padding: 10px;
}
h2 {
    font-weight: bold;
    display: inline-block;
}
.refresh {
    font-size: 80%;
    margin-left: 10px;
}
.header {
    background: #ECECEC;
    padding: 5px;
}
.suggestions {
    border: 2px solid #ECECEC;
}
li {
    padding: 5px;
}
li img {
    width: 40px;
    height: 40px;
    border-radius: 20px;
}
li .username, li .close {
    display: inline-block;
    position: relative;
    bottom: 15px;
    left: 5px;
}

JavaScript

var input = document.querySelector('.input1');
var input2 = document.querySelector('.input2');
console.log(input)
var typing$ = Rx.Observable.fromEvent(input, 'input').map(ev => ev.target.value)
var typing2$ = Rx.Observable.fromEvent(input2, 'input').map(ev => ev.target.value)

var state1 = {items: [typing$]}
var state2 = {items: [typing$, typing2$]}

var $state = Rx.Observable.fromArray([state1, state2])
$state.publish({items: [typing$, typing$]})

var merged$ = $state.flatMap(function(state){
	console.log('state', state)
	return Rx.Observable.merge(state.items)
})

merged$.subscribe(function(val){
  // typing from input1 files 2 times
	console.log(val)  
})