博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Object.defineproperty实现数据和视图的联动 ------是不是就是 Angular 模型和视图的同步的实现方式???...
阅读量:6367 次
发布时间:2019-06-23

本文共 2354 字,大约阅读时间需要 7 分钟。

参考:

 -----------------------------------------------------------------

这里的一篇文章讲的是 javascript 中的依赖注入:

计算机编程的世界其实就是一个将简单的部分不断地抽象,并将这些抽象组织起来的过程。

依赖注入解决的正是 如何有效组织代码依赖的模块的问题。

------------------------------------------------------------------

前端 MVC 的实现,其中可能用到一个知识点。

Object.defineProperty 语法

var o = {}; // 创建一个新对象// Example of an object property added with defineProperty with a data property descriptorObject.defineProperty(o, "a", {value : 37,                               writable : true,                               enumerable : true,                               configurable : true});// 对象o拥有了属性a,值为37// Example of an object property added with defineProperty with an accessor property descriptorvar bValue;Object.defineProperty(o, "b", {get : function(){ return bValue; },                               set : function(newValue){ bValue = newValue; },                               enumerable : true,                               configurable : true});o.b = 38;// 对象o拥有了属性b,值为38// The value of o.b is now always identical to bValue, unless o.b is redefined// 数据描述符和存取描述符不能混合使用Object.defineProperty(o, "conflict", { value: 0x9f91102,                                        get: function() { return 0xdeadbeef; } });// throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors

  

The value of o.b is now always identical to bValue, unless o.b is redefined

数据和视图联动

给对象o定义新的属性b,并且定义属性b的get和set方法,当o.b的时候会调用b属性的get方法,给b属性赋值的时候,会调用set方法,这就是修改数据的时候,视图会自动更新的关键

前端获取数据后,需要根据数据操作dom,视图变化后,需要修改不少代码,有没有方法将数据和dom操作隔离,看一个例子

显示用户信息的html模版

 

你好,

 

视图控制器

//视图控制器    var userInfo = {};    Object.defineProperty(userInfo, "nickName", {        get: function(){            return document.getElementById('nickName').innerHTML;        },        set: function(nick){            document.getElementById('nickName').innerHTML = nick;        }    });    Object.defineProperty(userInfo, "introduce", {        get: function(){            return document.getElementById('introduce').innerHTML;        },        set: function(introduce){            document.getElementById('introduce').innerHTML = introduce;        }    })    //数据    //todo 获取用户信息的代码    userInfo.nickName = "xxx";    userInfo.introduce = "我是xxx,我来自云南,..."

  设置userInfo的nickName属性时会调用set方法,更新dom节点的html

浏览器访问 test.html,运行的效果如下图:

 

 

更新模型,视图同步更新

 

 

转载地址:http://vbrma.baihongyu.com/

你可能感兴趣的文章
Codeforces Round #374 (Div. 2) D. Maxim and Array 贪心
查看>>
HTML DOM 教程Part1
查看>>
GBDT的基本原理
查看>>
MySQL修改root密码的多种方法(转)
查看>>
MongoDB 基础命令——数据库表的增删改查——遍历操作表中的记录
查看>>
.NET Core 跨平台发布(dotnet publish)
查看>>
Activity入门(一)
查看>>
CentOS下如何从vi编辑器插入模式退出到命令模式
查看>>
Mysql索引的类型
查看>>
Eclipse debug模式 总是进入processWorkerExit
查看>>
Nginx的https配置记录以及http强制跳转到https的方法梳理
查看>>
[每天五分钟,备战架构师-1]操作系统的类型和结构
查看>>
springcloud(十三):Eureka 2.X 停止开发,但注册中心还有更多选择:Consul 使用详解...
查看>>
关于Boolean类型做为同步锁异常问题
查看>>
TestLink运行环境:Redhat5+Apache2.2.17+php-5.3.5+MySQL5.5.9-1
查看>>
Get File Name from File Path in Python | Code Comments
查看>>
显示本月每一天日期
查看>>
[转]java 自动装箱与拆箱
查看>>
NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配
查看>>
think in coding
查看>>