<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
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |