观察者模式(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;
      }
    }
  }
时间: 2024-10-24 07:58:36

观察者模式(3)--双向数据绑定的相关文章

双向数据绑定和单项数据绑定的认识

参考文章: https://segmentfault.com/q/1010000002511449/a-1020000002514653 https://www.zhihu.com/question/49964363/answer/136022879 单向数据绑定:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面. 单向数据绑定缺点:HTML代码一旦生成完以后,就没有办法再变了,如果有新的数据来了,那就必须把之前的HT

vue双向数据绑定原理探究(附demo)

昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与UI层的同步,数据再两者之间的任一者发生变化时都会同步更新到另一者. 双向绑定的一些方法 目前,前端实现数据双向数据绑定的方法大致有以下三种: 1.发布者-订阅者模式(backbone.js) 思路:使用自定义的data属性在HTML代码中指明绑定.所有绑定起来的JavaScript对象以及DOM元

angularjs学习笔记--主html&amp;template html&amp;module&amp;template js、模块、控制器、双向数据绑定、过滤器

// Register the `phoneList` component on the `phoneList` module, angular. module('phoneList'). component('phoneList', {...}); // Define the `phonecatApp` module angular.module('phonecatApp', [ // ...which depends on the `phoneList` module 'phoneList'

angular和vue双向数据绑定

angular和vue双向数据绑定的原理(重点是vue的双向绑定) 我在整理javascript高级程序设计的笔记的时候看到面向对象设计那章,讲到对象属性分为数据属性和访问器属性,我们平时用的js对象90%以上都只是用到数据属性;我们向来讲解下数据属性和访问器属性到底是什么? 数据属性:数据属性包含一个数据值的位置,在这个位置可以读取和写入值. 访问器属性:访问器属性不包含数据值;他们包含一对getter和setter函数在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值,在写

angularjs - 为何要双向数据绑定

最典型的场景应该属于表单 类似表单和表格之类的场景,展示与提交一般是同时存在的. 通常情况下,单向数据绑定即可解决业务需求,如数据库的内容绑定到html中展示到页面即可 但若需要设计提交功能,双向数据绑定就会发生很便捷的作用. 双向数据绑定指的是:当文本框(或其他绑定标签.控件)发生改变时,Model也会随之发生改变 这样的话.已更改的model可以立即提交无需通过繁琐的jquery获取dom和value操作 <!doctype html> <html ng-app="User

利刃 MVVMLight 3:双向数据绑定

上篇我们已经了解了MVVM的框架结构和运行原理.这里我们来看一下伟大的双向数据绑定. 说到双向绑定,大家比较熟悉的应该就是AngularJS了,几乎所有的AngularJS 系列教程的开篇几章都要涉及到,真的是很好用. 表达的效果很简单:就是在界面的操作对数据模型的修改能实时反映到数据:而数据的变更能实时展现到界面.即视图数据模型(ViewModel)和视图(View)之间的双向绑定和触发. 我们来操作一个试试看: 第一步:先写一个Model,里面包含我们需要的数据信息,代码如下: 1 ///

双向数据绑定与单向数据绑定

在react中是单向数据绑定,而在vue和augular中的特色是双向数据绑定.为什么会选择两种不同的机制呢?我猜测是两种不同的机制有不同的适应场景,查了一些资料后,总结一下. 一.各自优势 双向数据绑定给人的最大的优越感就是方便.当数据data发生变化时,页面自动发生更新.但是有一个缺点也是因为自动更新而导致的,因为这样你就不知道data什么时候变了,也不知道是谁变了,变化后也不会通知你,当然你可以watch来监听data的变化,但是这变复杂了,还不如单向数据绑定. 所以说按照方神的说法:Vu

AngularJs——双向数据绑定示例

最近在做Hybird App,接触到了AngularJs,感觉用起来蛮爽的,今天share下AngularJs的核心功能之一:双向数据绑定. 我们在页面中加入一个表单: <!DOCTYPE html> <html ng-app="userInfoModule"> <head> <meta name="content-type" content="text/html; charset=UTF-8">

Angular之双向数据绑定

---恢复内容开始--- angular最初进入前端开发人员视野的时候,给人以不可磨灭的印象之一就是它的双向数据绑定的实现.本篇章会先介绍如何使用此功能,然后在深入解释它的双向绑定的机制是如何实现的. angular中的data-binding指的是模型models和视图views之间的自动同步.angular实现双向绑定后,会让你觉得数据模型是页面中数据唯一的真实来源.当model改变后,视图反映改变,反之亦然.通俗的说,所谓的双向数据绑定,无非就是从界面的操作能实时反映到数据,数据的变更能实

AngularJS入门心得2——何为双向数据绑定

前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯.最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西太多了,看不了几行代码就有几个常用函数不熟悉的.看过了大漠的视频,算是了解了AngularJS的一些优良特性.后来准备投身<AngularJS权威教程>,跟着它走,可是一来可能自己道行不够,二来,个人觉得这本书翻译的有些生硬以及一些瑕疵,比如: (1)9.2节:在指令中适用自作用域 (2)9.2节:在指令中适用自作用域 当然,以上都是一些瑕