zoukankan      html  css  js  c++  java
  • [Cycle.js] Fine-grained control over the DOM Source

    Currently in our main() function,  we get click$ event.

    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);
    
      
  • 相关阅读:
    Match function in R
    Excel lastindex of a substring
    Print a file's last modified date in Bash
    IQR(Inter-Quartile Range)
    nohup 让进程在后台可靠运行的几种方法
    extension(类扩展)和 category(类别)
    Dart学习-操作符
    为什么我觉得Python烂的要死?
    自定义 Cordova插件(基础篇)
    Cordova入门系列(四)自定义Cordova插件--showToast
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5185685.html
Copyright © 2011-2022 走看看