jquery 简单双向绑定

写在前面

1.学习backbone的时候接触到一个情况:model要求通过set来修改而不能直接修改attruebute[虽然也能修改值]

2.angular使用ng来绑定数据,avalon用ms-attr

这个和双向绑定有点关系,下面通过代码来解开之前的疑惑,红色部分为答案

参考:

http://www.oschina.net/translate/easy-two-way-data-binding-in-javascript

效果:

http://sandbox.runjs.cn/show/uqcfqkcj

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script  type="text/javascript" src="jquery-1.8.3.min.js"></script>

</head>
<body>
<h2>第一个实例</h2>
<input type="text" data-bind-123="name" /><div data-bind-123="name"></div>
<input type="text" data-bind-123="name2" /><div data-bind-123="name2"></div>
<input type="text" data-bind-123="name3" /><div data-bind-123="name3"></div>
<h2>第二个实例</h2>
<input type="text" data-bind-hehe="name3" /><div data-bind-hehe="name3"></div>
<input type="text" data-bind-hehe="name2" /><div data-bind-hehe="name2"></div>
<script>
   <!--这里放js代码-->
</script>
</body>
</html> 

javascript:



  var a = new  Bidirectional({
      $id:"123",
      attr:{
          name:"99",
          name2:"22222",
          name3:"22222"
      }

  });



  var b = new  Bidirectional({
      $id:"hehe",
      attr:{
          name3:"我是第二个对象",
          name2:"name2"
      }

  });


  //修改数据,这里只用通过set修改才会同步到html
  setTimeout(function(){
          b.set({"name3": "999999"});

  },1000);


//判断是否是json
  var isJson = function(obj){
      var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
      return isjson;

  };



  //新建对象
  function Bidirectional( opt ) {
      //没吊用一次就新建一次对象
      var uid=opt.$id;
      var __This=this;
      this.uid=opt.$id;
      //html单项同步

      this.DataBinder=function( object_id ) {

       //把事件绑定在一个空白的jquery对象上

          var pubSub = jQuery({});
          var data_attr = "bind-" + object_id, message = object_id + ":change";
          jQuery( document ).on( "change", "[data-" + data_attr + "]", function( evt ) {
              var $input = jQuery( this );
              var attr=$(this).attr("data-" + data_attr);
              __This.vm.attributes[attr]=$input.val();
              pubSub.trigger( message, [ $input.data( data_attr ), $input.val()] );

          });



          //这里的function里面的传参让我有点搞不懂
          pubSub.on( message, function( evt, prop_name, new_val ) {
              jQuery( "[data-" + data_attr + "=" + prop_name + "]" ).each( function() {
                  var $bound = jQuery( this );
                  if ( $bound.is("input, textarea, select") ) {
                      $bound.val( new_val );
                  } else {
                      $bound.html( new_val );
                  }
              });

          });

          return pubSub;

      }


      this.binder = new this.DataBinder(uid);


      this.vm = {

          attributes: {},

          set: function( opt) {
              //set接受一个json对象,二次调用的时候没有传值得key的值不会被修改,
              if(isJson(opt)){
                  $.extend(__This.vm.attributes,opt);

                  console.log(__This.vm.attributes);

                //只有通过set来修改才会触发同步函数

                  __This.binder.trigger( uid + "set"+":change", [ opt, this ] );
              }
              else{
                  throw Error("set只接受不为空的json格式数据")
              }
          },
          get: function( attr_name ) {
              return this.attributes[ attr_name ];
          },
          _binder:this.binder

      };

    //判断初始化传值

      this.vm.attributes=opt.attr!=""?opt.attr:{};


      //向html单项同步

      Singlesynchronous();


      function Singlesynchronous(){

    //这里可以和avalon的指令“ms-html、ms-repeat那样实现字符串、数组的处理”

          $( "[data-bind-" +uid+ "]").each(function(){
              var key=$(this).attr("data-bind-"+uid);
              if($(this).is("input, textarea, select") ){
                  $(this).val(  __This.vm.attributes[key] );
              }
              else{
                  $(this).html(  __This.vm.attributes[key] );
              }
          });

      }


      //修改的时候触发向HTML单项同步
      this.binder.on( uid + "set"+ ":change", function( evt, opt, initiator ) {
          Singlesynchronous();

      });

    //通过return可以屏蔽对象下的其他方法属性,通过console.log(new Bidirectional())查看到的是vm下属性方法

      return this.vm;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆康永

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值