首页 > Web开发 > 详细

[Cycle.js] Making our toy DOM Driver more flexible

时间:2016-02-09 19:57:41      阅读:292      评论:0      收藏:0      [点我收藏+]

Our previous toy DOM Driver is still primitive. We are only able to sends strings as the textContent of the container element. We cannot yet create headers and inputs and all sorts of fancy DOM elements. In this lesson we will see how to send objects that describe what elements should exist, instead of strings as the DOM sink.

 

// Logic (functional)
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;
}





// 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 = Rx.Observable.fromEvent(document, ‘click‘);
  return DOMSource;
}

function consoleLogDriver(msg$) {
  msg$.subscribe(msg => console.log(msg));
}

const drivers = {
  DOM: DOMDriver,
  Log: consoleLogDriver,
}

Cycle.run(main, drivers);

  

 

[Cycle.js] Making our toy DOM Driver more flexible

原文:http://www.cnblogs.com/Answer1215/p/5185665.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!