1. //双向绑定实例 <input name="" ng-bind-123="name" />
  2. function DataBinder( object_id ) {
  3. // Create a simple PubSub object
  4. var pubSub = {
  5. callbacks: {},
  6. on: function( msg, callback ) {
  7. this.callbacks[ msg ] = this.callbacks[ msg ] || [];
  8. this.callbacks[ msg ].push( callback );
  9. },
  10.  
  11. publish: function( msg ) {
  12. this.callbacks[ msg ] = this.callbacks[ msg ] || []
  13. for ( var i = 0, len = this.callbacks[ msg ].length; i < len; i++ ) {
  14. this.callbacks[ msg ][ i ].apply( this, arguments );
  15. }
  16. }
  17. },
  18. data_attr = "ng-bind-" + object_id,
  19. message = object_id + ":keyup",
  20.  
  21. changeHandler = function( evt ) {
  22. var target = evt.target || evt.srcElement, // IE8 compatibility
  23. prop_name = target.getAttribute( data_attr );
  24.  
  25. if ( prop_name && prop_name !== "" ) {
  26. pubSub.publish( message, prop_name, target.value );
  27. }
  28. };
  29.  
  30. // Listen to change events and proxy to PubSub
  31. if ( document.addEventListener ) {
  32. document.addEventListener( "keyup", changeHandler, false );
  33. } else {
  34. // IE8 uses attachEvent instead of addEventListener
  35. document.attachEvent( "onkeyup", changeHandler );
  36. }
  37.  
  38. // PubSub propagates changes to all bound elements
  39. pubSub.on( message, function( evt, prop_name, new_val ) {
  40. var elements = document.querySelectorAll("[" + data_attr + "=" + prop_name + "]"),
  41. tag_name;
  42.  
  43. for ( var i = 0, len = elements.length; i < len; i++ ) {
  44. tag_name = elements[ i ].tagName.toLowerCase();
  45.  
  46. if ( tag_name === "input" || tag_name === "textarea" || tag_name === "select" ) {
  47. elements[ i ].value = new_val;
  48. } else {
  49. elements[ i ].innerHTML = new_val;
  50. }
  51. }
  52. });
  53.  
  54. return pubSub;
  55. }
  56.  
  57. function User( uid ) {
  58. // ...
  59. var binder = new DataBinder( uid ),
  60.  
  61. user = {
  62. // ...
  63. attributes: {},
  64. set: function( attr_name, val ) {
  65. this.attributes[ attr_name ] = val;
  66. // Use the `publish` method
  67. binder.publish( uid + ":keyup", attr_name, val, this );
  68. },
  69. get: function( attr_name ) {
  70. return this.attributes[ attr_name ];
  71. }
  72. }
  73.  
  74. binder.on( uid + ":keyup", function( evt, attr_name, new_val, initiator ) {
  75. if ( initiator !== user ) {
  76. user.set( attr_name, new_val );
  77. }
  78. });
  79.  
  80. return user;
  81. }
  82.  
  83. // javascript
  84. var user = new User( 'test');
  85. user.set( "name", "binding" );

js 双向绑定的更多相关文章

  1. Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)

    Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...

  2. Vue.js双向绑定的实现原理

    Vue.js最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究几乎所有Vue的开篇介绍都会提到的hello world双向绑定是怎样实现的.先讲涉及的知识点,再参考源码,用尽可能少 ...

  3. Vue.js双向绑定原理

    Vue.js最核心的功能有两个,一个是响应式的数据绑定系统,另一个是组件系统.本文仅仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化的代码实现一个简单的hello world示例. 一.访问器属 ...

  4. 很easy的js双向绑定框架(二):控制器继承

    初衷 上一篇已经实现了数据的双向绑定,但model的控制范围是整个文档.在实际project中必需要有作用范围,以便做ui模块的拆分. 这一篇,我们希望实现像angularjs一样的控制器继承: 1. ...

  5. vue.js双向绑定之--select获取text

    在大多数情况下select下拉菜单都是value和text设置不同的值的,value一般来说是与后台交互的值,而text是前端用来显示的文本: 但是,vue.js对到表单的双向绑定时如果option设 ...

  6. Angular js 双向绑定时字符串的转换成 数字类型的问题

    问题: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <scrip ...

  7. js 双向绑定数据

    let aaa = []; let bbb = [1,2,3]; let ccc = [0,9,8]; aaa = bbb; //此时aaa与bbb被绑定(aaa指向bbb的指向) ,若使用push则 ...

  8. js双向绑定和地址传递带来的痛苦解决方案之对象拷贝

    function cloneObj(obj) { var newObj = {}; if (obj instanceof Array) { newObj = []; } for (var key in ...

  9. 用原生 JS 实现双向绑定及应用实例

    写在前面: 所谓的双向绑定,无非是从界面的操作能实时反映到数据,数据的变更也能实时展现到界面.angular封装了双向绑定的方法,使双向绑定变得十分简单.但是在有些场景下(比如下面那个场景),不能使用 ...

随机推荐

  1. C++类静态变量的一种使用特例

    不同进程里的数据默认情况下是互不影响的. 静态变量是属于类本身的,它的所有实例可以共享这个静态变量,但是有个先天条件就是在同一个进程的情况下!!

  2. react-redux升级到7.0.x后报错"TypeError: Object(...) is not a function"

    同样一套代码,react-redux 6.0.x 的版本下可以正常运行,在7.0.x的版本下出现报错,而且报错原因实在太难定位了 package.json { ... "react-redu ...

  3. Codeforces Round #375 (Div. 2)【A,B【模拟】,D【DFS】】

    PS_B:阿洗吧!B题卧槽数组开了250... PS_D:D题主要挂在了50*50口算得了250,数组开小,然后一开始还错了.= =哎,以后对于数据范围还是注意一点: 卧槽,这场可真二百五了... A ...

  4. 洛谷P4884 多少个1?(BSGS)

    传送门 模数好大……__int128好麻烦……而且BSGS第一次写有点写蒙了…… $11...1(N个1)\equiv k(mod m)$很难算,那么考虑转化一下 先把$11...1(N个1)$写成$ ...

  5. “我要点爆”微信小程序云开发实例

    使用云开发进行微信小程序“我要点爆”的制作 下一章:“我要点爆”微信小程序云开发之项目建立与我的页面功能实现 接下来我将对“我要点爆”微信小程序进行完整的开源介绍 小程序名称: 我要点爆 查看方式:从 ...

  6. Luogu P4892 GodFly的寻宝之旅【状压dp】By cellur925

    题目传送门 又是一道状压+计数类好题hh(真香).数据范围非常友好,告诉我们\(n<=18\),非常符合状压的性质. 其实感觉和\(Hamilton\)路径那题还是有些相似的,我们可以类似地设计 ...

  7. 掌握MySQL数据库这些优化技巧,事半功倍!

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大 ...

  8. 百度网盘不限速!VIP视频免费看!这两款插件被无数人安利!

    今天给给位推荐两款,我一直在使用的浏览器插件,简直爆炸!全网VIP视频随意看,所有网页上的视频,你想要的全部都能下载! 这两款插件堪称日常必备插件,只要你使用浏览器,就一定需要下面这些插件功能:快速下 ...

  9. Python-4-设置字符串的格式字符串

    字符串是不可变的,所有元素赋值和切片赋值都是非法的   1.替换字段名 可以按顺序和名称匹配 >>> "{foo} {} {bar} {}".format(1, ...

  10. [題解]luogu_P1120小木棍(搜索)

    好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相 ...