[Cycle.js] Fine-grained control over the DOM Source
2016-02-09 20:24
477 查看
Currently in our main() function, we get click$ event.
What if we want to change it to mouse event? we need to somehow modiy the DOMSource it return from:
So for main() function, we need to call a function able to manage the tagName and eventType:
And for the DomDirver, we need add a function which enable user to pass down element and eventType:
-------------------------
Code:
function main(sources) { const click$ = sources.DOM; const sinks = { DOM: click$ .startWith(null) .flatMapLatest(() => Rx.Observable.timer(0, 1000) //describe what element should exist .map(i => { return { tagName: 'h1', children: [ { tagName: 'span', children: [ `time esplsed: ${i}` ] } ] } }) ), Log: Rx.Observable.timer(0, 2000).map(i => 2*i), }; return sinks; }
What if we want to change it to mouse event? we need to somehow modiy the DOMSource it return from:
function DOMDriver(obj$) { function createElement(obj) { const element = document.createElement(obj.tagName); obj.children .filter(c => typeof c === 'object') // if it is object, then we need to create another element .map(createElement) .forEach(c => element.appendChild(c)); obj.children .filter(c => typeof c === 'string') .forEach(c => element.innerHTML += c); return element; } obj$.subscribe(obj => { const container = document.querySelector('#app'); container.innerHTML = ''; const element = createElement(obj); container.appendChild(element); }); const DOMSource = Rx.Observable.fromEvent(document, 'click'); return DOMSource; }
So for main() function, we need to call a function able to manage the tagName and eventType:
const mouseover$ = sources.DOM.selectEvents('span', 'mouseover');
And for the DomDirver, we need add a function which enable user to pass down element and eventType:
const DOMSource = { selectEvents: function(tagName, eventName){ return Rx.Observable.fromEvent(document, eventName); } };
-------------------------
Code:
// Logic (functional) function main(sources) { const mouseover$ = sources.DOM.selectEvents('span', 'mouseover'); const sinks = { DOM: mouseover$ .startWith(null) .flatMapLatest(() => Rx.Observable.timer(0, 1000) //describe what element should exist .map(i => { return { tagName: 'h1', children: [ { tagName: 'span', children: [ `time esplsed: ${i}` ] } ] } }) ), Log: Rx.Observable.timer(0, 2000).map(i => 2*i), }; return sinks; } // source: input (read) effects // sink: output (write) effects // Effects (imperative) function DOMDriver(obj$) { function createElement(obj) { const element = document.createElement(obj.tagName); obj.children .filter(c => typeof c === 'object') // if it is object, then we need to create another element .map(createElement) .forEach(c => element.appendChild(c)); obj.children .filter(c => typeof c === 'string') .forEach(c => element.innerHTML += c); return element; } obj$.subscribe(obj => { const container = document.querySelector('#app'); container.innerHTML = ''; const element = createElement(obj); container.appendChild(element); }); const DOMSource = { selectEvents: function(tagName, eventName){ return Rx.Observable.fromEvent(document, eventName); } }; return DOMSource; } function consoleLogDriver(msg$) { msg$.subscribe(msg => console.log(msg)); } const drivers = { DOM: DOMDriver, Log: consoleLogDriver, } Cycle.run(main, drivers);
相关文章推荐
- js 强制转换
- [Cycle.js] Making our toy DOM Driver more flexible
- js 隐式转换
- #学习笔记#(37)自制2016年日期选择器-JS
- #学习笔记#(36)JS初步实现todolist添加任务功能
- JavaScript DOM编程基础精华03(动态设置,层的操作,性能问题)
- JavaScript DOM编程基础精华03(动态设置,层的操作,性能问题)
- JavaScript DOM编程基础精华02(window对象的属性,事件中的this,动态创建DOM,innerText和innerHTML)
- JavaScript DOM编程基础精华02(window对象的属性,事件中的this,动态创建DOM,innerText和innerHTML)
- JSP学习小结
- JavaScript DOM编程基础精华01(DOM入门,DOM模型和获取页面元素,事件,window对象的方法)
- JavaScript DOM编程基础精华01(DOM入门,DOM模型和获取页面元素,事件,window对象的方法)
- js 支持的原始数据类型
- JS产生随机数的几个用法!
- js 的基础知识变量
- 设置jsp默认打开方式
- JavaScript引用类型和值类型
- JS prototype 属性
- [转]fastjson常见问题
- json