Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.3.22/rx.all.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/cyclejs-core/3.1.0/cycle.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/cyclejs-dom/5.3.0/cycle-dom.min.js"></script>
<meta name="description" content="Cycle.js Click Stream Example: Model-View-Intent">
  <meta charset="utf-8">
  <title>RxJS Click Stream Example</title>
</head>
<body>
  <div id="app"></div>
</body>
</html>
 
function intent({DOM}) {
  return {
    addTodo: DOM.get('input', 'change').
      map(evt => evt.target.value).
      filter(val => val.trim().length),
    removeTodo: DOM.get('button', 'click').
      // Map the remove button click to the item text
      map(evt => evt.target.previousElementSibling.innerText.trim())
  };
}
const Operations = {
  AddItem: newItem => state => ({
    items: state.items.concat(newItem)
  }),
  RemoveItem: itemToRemove => state => ({
    items: state.items.filter(item => item !== itemToRemove)
  })
};
function model(intents) {
  // Map our "addTodo" intent to an add operation
  var addOperations$ = intents.addTodo.
      map(item => Operations.AddItem(item));
  // Map our "removeTodo" intent to a remove opeartion
  var removeOperations$ = intents.removeTodo.
      map(item => Operations.RemoveItem(item));
  // Merge our operations into a single stream
  // of operations on state
  var allOperations$ = Rx.Observable.merge(addOperations$, removeOperations$);
  // Apply operations to the state
  var state$ = allOperations$.
      scan({ items: [] }, (state, operation) => operation(state));
  return state$;
}
function view(state$) {
  const h = CycleDOM.h;
  return state$.
      startWith({ items: [] }).
      map(state => h('div', [
        h('div', [
          h('input', {type: 'text', value: ''})
        ]),
        h('ul', state.items.map(todo =>
          h('li', [
            h('span', todo),
            h('button', 'x')
          ]))
        )
      ]));
}
function main({DOM}) {
  return {
    DOM: view(model(intent({DOM})))
  }
}
// Bootstrap the application
Cycle.run(main, {
  DOM: CycleDOM.makeDOMDriver('#app')
});
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
eschwartzpro
0viewers