全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

angular双向绑定模拟探索

前言
本次探索的demo是基于jquery写的,毕竟jquery提供了强大的选择器,用惯了就离不开它了!angular的双向绑定实在是有点精深,本次探索只实现了文本的双向绑定。

View-Model

先看效果:文本框输入内容,model层数据也同步过来了

Model-View

先看效果:js改变model层数据,视图也立即随之变化

上我的demo

<!DOCTYPE html>
<html lang="en" data-swq-app = 'app'>
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="./js/jquery-1.9.1.min.js"></script>
</head>
<body>
<input type="text" data-swq-model="name">
<input type="text" data-swq-model="age">
<div>name:<span data-swq-bind="name"></span></div>
<div>age:<span data-swq-bind="age"></span></div>
<script>
  (function(window){
    //模仿angular的双向绑定
    //需要一个发布者,也就是angular里面的$scope的存在,这里我取我的大名swq,是个对象
    //需要订阅者数据容器
    var swqArray = []; //订阅者数据容器
    var swqNamesArray = ['name','age'];  //存放订阅者标识容器,这边写死,实际上肯定需要动态获取
    window.swq ={
      scanTag : function (){
      var swqController = $('[data-swq-app]:first');
//    view层需要和model层绑定的元素进行事件绑定
      var allModelView = swqController.find('[data-swq-model]');
      allModelView.each(function(){
        $(this).on('keyup',function(event){
          var targetBind = $(this).data('swqModel');
          var value = $(this).val();
          if(targetBind && targetBind.length > 0){
            swq[targetBind] = value;
          }
        });
      });
//    model层需要劫持绑定的进行绑定
      $.each(swqNamesArray,function(index,value){
        notifyProperty(value);
      })
    }
    };
    //数据的变化需要反映到视图上,因此要监听到数据的变化,js原生的defineProperty给我们提供了监听的可能,劫持更改数据,思路有点类似前端路由的实现思路,我监听到你某个操作但是我不做你的功能,我自己定义该做的事
    function notifyProperty(name){
      Object.defineProperty(swq,name,{
        //劫持到set方法
        set : function(newValue){
          swqArray[name] = newValue;
//      实现model-view的同步
          var $target = $('[data-swq-bind = "'+name+'"],[data-swq-model = "'+name+'"]');
          if($target){
            $target.each(function(){
              var tagName = $(this)[0].tagName.toLowerCase();
              if(tagName == 'input' || tagName =='select' || tagName =='textarea'){
                $(this).val(newValue)
              }else{
                $(this).text(newValue)
              }
            })
          }
        },
        //劫持到get方法,因为get方法已经被劫持,所以比如我们劫持了swq.name,那么swq.name就没有值了,所以我们给它返回值,返回值是存在订阅者数据容器里面的
        get : function(){
          return swqArray[name];
        }
      });
    }
 
  })(window);
 
  swq.scanTag();//初始化,进行双向绑定
//  尚未实现的功能 ;
//  1.动态获取需要进行双向绑定的name
//  2.只实现了text文本的绑定,对象的绑定需要递归
//  3.脏查询机制还未实现,就是我们某些js后增加的需要双向绑定的name,没办法进行双向绑定了
//  4.angular双花括号解析表达式未实现<br>//  5.感觉还差得远,哪位大神看到有成熟的demo记得给链接!!!
 
 
</script>
</body>
</html>

demo解读

核心其实就是js原生的defineProperty。在这之前,我们需要知道,我们在给某个对象添加和获取属性和方法时其实它底层是调用了set和get方法,比如obj.name="名字",这里是调用了set方法,obj.name这里是调用了get方法。

因此,我们可以劫持js的这两个底层方法

Object.defineProperty(obj,attribute,{set:function(newVlaue){//dosomething},get:function(){//dosomething}})
obj是我们的model对象,attribute就是我们要劫持的需要双向绑定的name,set就是设置属性时底层调用的方法,get就是获取属性时底层调用的方法因为我们劫持了这两个底层方法,我们可以做我们想做的事,但是同时我们也破坏了它本身的设置和获取功能,因此我这里是把订阅者的数据都是存在一个数组里面的,我还声明了一个数组用来保存所有需要进行双向绑定的name,比较low的是我这边是写死的,实际情况下肯定是要动态获取所有需要双向绑定的name的

结言

本人小菜对前端技术很感兴趣,有大神路过给点指点,我也可以关注下各位大神的博客,希望可以学到更多的东西!!!谢谢

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# angular  # 双向绑定  # 理解Angular数据双向绑定  # 深入学习AngularJS中数据的双向绑定机制  # Angular2实现自定义双向绑定属性  # Angular JS数据的双向绑定详解及实例  # AngularJS学习笔记(三)数据双向绑定的简单实例  # AngularJS入门教程之双向绑定详解  # 浅谈AngularJs 双向绑定原理(数据绑定机制)  # 绑定  # 大神  # 我们可以  # 这两个  # 递归  # 先看  # 返回值  # 的是  # 都是  # 实现了  # 我也  # 是个  # 我还  # 在这  # 给我们  # 感兴趣  # 没办法  # 到你  # 还未  # 不做 


相关文章: 建站主机选购指南:核心配置与性价比推荐解析  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何在腾讯云服务器上快速搭建个人网站?  建站OpenVZ教程与优化策略:配置指南与性能提升  建站之星ASP如何实现CMS高效搭建与安全管理?  如何续费美橙建站之星域名及服务?  建站之星会员如何解锁更多建站功能?  建站主机是否等同于虚拟主机?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  建站DNS解析失败?如何正确配置域名服务器?  建站ABC备案流程中有哪些关键注意事项?  如何通过cPanel快速搭建网站?  高端网站建设与定制开发一站式解决方案 中企动力  网站制作企业,网站的banner和导航栏是指什么?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  宝塔面板创建网站无法访问?如何快速排查修复?  建站之星后台管理如何实现高效配置?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  深圳网站制作培训,深圳哪些招聘网站比较好?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何自定义建站之星模板颜色并下载新样式?  建站主机功能解析:服务器选择与快速搭建指南  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何快速辨别茅台真假?关键步骤解析  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何访问已购建站主机并解决登录问题?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  建站之星导航如何优化提升用户体验?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何在万网开始建站?分步指南解析  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  h5在线制作网站电脑版下载,h5网页制作软件?  建站之星收费标准详解:套餐费用及年费价格表一览  如何快速搭建虚拟主机网站?新手必看指南  如何通过虚拟机搭建网站?详细步骤解析  如何在橙子建站上传落地页?操作指南详解  C++中引用和指针有什么区别?(代码说明)  家具网站制作软件,家具厂怎么跑业务?  建站之星代理平台如何选择最佳方案?  建站之星导航配置指南:自助建站与SEO优化全解析  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  Python如何创建带属性的XML节点  如何在阿里云ECS服务器部署织梦CMS网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速搭建FTP站点实现文件共享?  如何有效防御Web建站篡改攻击?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  如何通过主机屋免费建站教程十分钟搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。