zoukankan      html  css  js  c++  java
  • 观察者模式(3)--双向数据绑定

    实现数据的双向绑定最直接的方式就是PubSub模式。

    (1)当model发生变化时,触发Model change事件,然后通过相应事件处理函数更新界面。--'model-update-event'

    (2)当界面更新时,触发UI change事件,然后通过相应事件处理函数更新Model,以及绑定在Model上的其他界面控件。--'ui-update-event'

     

    对于所有支持双向绑定的页面控件来说,当控件的'值'发生变化时,会触发'ui-update-event'事件。(这里只处理包含't-binding'属性的控件)。

    当Model订阅了(监听)'ui-update-event',相应的界面改动会更新Model。

    大致的原理为:  

    function DataBinder(){
      //发布/订阅封装
      var pubSub={    
        handlers:{},
        on:function(event,callback){
          if(!this.handlers[event]){
            this.handlers[event]=[];
          }
          this.handlers[event].push(callback);
        },
        publish:function(event){
          var handler=this.handlers[event];
          if(handler){
            for(var i=0;i<handler.length;i++){
              handler[i]();
            }
          }
        }
      };
    
      changeHandler=fucntion(e){
        var target=e.target||e.srcElement;
        var prop_name=event.getAttribute('t-binding');
        if(prop_name && prop_name!==''){
          pubSub.publish('ui-update-event',prop_name,target.value);
        };
      };
      //监听事件变化(这里监听keyup和change事件),并代理到pubSub上。
      if(document.addEventListener){
        document.addEventListener('keyup',changeHandler,false);
        document.addEventListener('change',changeHandler,false);
      }else{
        //兼容ie8  
        document.attachEvent('keyup',changeHandler);
        document.attarEvent('change',changeHandler);
      };
      //pubSub将变化传播到所有绑定元素上。
      pubSub.on('model-update-event',function(propName,propValue){
        var eles=document.querySelectorAll('[t-binding="'+propName+'"]');
        for(var i=0;i<eles.length;i++){
          var eleType=eles[i].tagName.toLowerCase(); 
        //更新UI界面上元素的内容  
          if(eleType=='input' || eleType=='textarea' || eleType=='select' ){
            eles[i].value=propValue;
          }else{
            eles[i].innerHTML=propValue;
          }
        }
      }
  • 相关阅读:
    JAVA日期与时间
    CSS的重点知识
    java使用深度优先遍历算法的算法题
    使用python命令行参数的例子
    JAVA中的BigInteger与BigDecimal类功能强大
    软件工程第一次作业
    ORACLE数据库知识点整理
    看懂PL/SQL执行计划
    Oracle Hints详解
    oracle创建用户、授权及角色管理
  • 原文地址:https://www.cnblogs.com/telnetzhang/p/5819711.html
Copyright © 2011-2022 走看看