迷你MVVM框架 avalonjs 0.82发布
迷你MVVM框架 avalonjs 0.82发布
本版本最大的改进是启用全新的parser。
parser是用于干什么的?在视图中,我们通过绑定属性实现双向绑定,比如ms-text="firstName", ms-html="sex + '士'", ms-visible="Math.abs(toggle + 2000) >= 20", 我们需要将它们转换为求值函数。我们通过ms-controller="vm"来绑定ViewModel,比如vm = { firstName: '司徒'}, 那么对于上面的第一个绑定,我们想让它变成函数,以前是这样实现的:
function anonymous(vm1372575919386) { with (vm1372575919386) { var ret1372575919386 = firstName } return ret1372575919386} |
然后视图刷新函数会将vm传入此函数,var ret = anonymous(vm), 得到'司徒',然后node.value = ret(注,这里的node 为文本节点,它在扫描DOM树时被抽取出来),完成视图的最少化刷新。这个过程中如何将绑定属性的值转换为求值函数显然是重中之重。
之前的parser,正如大家看到的那样,非常简单,然后with表达式一包,然后返回结果。但with在ES5的严格模式下运行不了,也一直为性能洁癖人士所不齿。并且它存在一个问题,它的依赖收集并不完整。比如下面这种
<p>aaa {{test1 && test2}} </p> |
上面的插值表达式是一个文本绑定,转换为求值函数时,为:
function anonymous(vm1372575919386) { with (vm1372575919386) { var ret1372575919386 = test1 && test2 } return ret1372575919386} |
当一开始test1为false, test2为true时,由于短路与的关系,我们并没有对test2进行取值。由于avalon只在求值函数的第一次执行时收集依赖,在依赖是通过求值赋值语句实现的,而这时,我们就肯定遗漏了test2了。因此一个全新的parser就迫在眉睫了。
新的parser的实现思路时,设法抽取到绑定值中的变量,然后转换为赋值语句,放到求值函数的最前面,这样就不会遗漏任何依赖了。问题是如何得到这些变量。比如上面三例,它们的变量依次是firstName, sex, toggle,我们要设法去掉所有杂质,首先要去掉注释,字符串,正则这些字面量,然后是加减乘除这些操作符,然后是if, while, for, undefined, void 等关键字,然后是作为某个对象的属性或方法存在的语句,如.prop,然后逗号这样用于断句用的符号。但即使这样,还会留下像Math, String等全局变量,这时我们就通过vm取hasOwnerProperty进行排除。
下面就是通过新的parser转换得到的求值函数。
function anonymous(vm1372575919386) { var firstName = vm1372575919386.firstName return firstName }function anonymous(vm1372575919386) { var test1= vm1372575919386.test1, test2 = vm1372575919386.test2 return test1 && test2} |
并且进一步,我们可以在里面塞进'use strict'来提高性能。
function anonymous(vm1372575919386) { 'use strict'; var firstName = vm1372575919386.firstName return firstName }function anonymous(vm1372575919386) { 'use strict'; var test1= vm1372575919386.test1, test2 = vm1372575919386.test2 return test1 && test2} |
如何存在过滤器
<div>{{ new Date | date('dd MM yyyy') }} </div> |
function anonymous(vm1372896828095_0, filters1372896828095) { 'use strict'; var ret1372896828095 = new Date if (filters1372896828095.date) { try { ret1372896828095 = filters1372896828095.date(ret1372896828095, 'dd MM yyyy') } catch (e) { } } return ret1372896828095} |
凭借着此新parser,avalon又有了一个质的提高。有关的parser的实现,可以详看该issue
读者们也可以对比angular的parser实现, avalon的是非常小巧的。
迷你MVVM框架在github的仓库https://github.com/RubyLouvre/avalon
官网地址http://rubylouvre.github.io/mvvm/
大家可以加入QQ群:79641290进行讨论,此群为技术群,禁水!
迷你MVVM框架 avalonjs 0.82发布的更多相关文章
- 迷你MVVM框架 avalonjs 0.95发布
迷你MVVM框架 avalonjs 0.95发布 本版本最主要的改进是ms-with 深层绑定的实现,至少,avalon1.0所有重要的feature已经开发完毕,之后就是小补小漏,性能优化了. ms ...
- 迷你MVVM框架 avalonjs 0.85发布
迷你MVVM框架 avalonjs 0.85发布 本版本对循环绑定做了巨大改进,感谢@soom, @limodou, @ztz, @Gaubee 提供的大量测试文件. fix scanNodes, 在 ...
- 迷你MVVM框架 avalonjs 0.8发布
本版本最重要的特性是引进了AMD规范的模块加载器,亦即原来mass Framework 的并行加载器, 不同之处,它引进了requirejs的xxx!风格的插件机制,比如要延迟到DOM树建完时触发,是 ...
- 迷你MVVM框架 avalonjs 0.99发布
在本版本主要是性能优化,添加一些有用的功能(如回调什么的),离成品阶段不远了. 修正 updateViewModel bug 修正监控数组的set方法 bug 添加data-each-rendered ...
- 迷你MVVM框架 avalonjs 0.9发布
本版本最大的改进是引进了ms-with绑定,现在可轻松遍历对象了. 改进列表如下: 重新使用082的scanNodes方法,因为有关旧式IE下UI渲染锁死的问题已经解决了. 优化each绑定与Coll ...
- 迷你MVVM框架 avalonjs 0.91发布
本版本修了一些BUG与不合理的地方,感谢感谢ztz, 民工精髓, 姚立, qiangtou等人指正. 处理AMD加载 旧式IE下移除script节点内存泄漏的问题 fix firefox 全系列vis ...
- 迷你MVVM框架 avalonjs 0.92发布
本版本最大的改进是引入ms-class的新风格支持,以前的不支持大写类名及多个类名同时操作,新风格支持了.还有对2维监控数组的支持.并着手修复UI框架. 重构 class, hover, active ...
- 迷你MVVM框架 avalonjs 0.93发布
这段时间吸取@limodou, @东灵等人的意见,做了以下改进 重构isArrayLike,提高avalon.each的性能,原来avalon.each是依赖于isArrayLike来判定是循环普通对 ...
- 迷你MVVM框架 avalonjs 0.94发布
本版本主要做了如下改进: 优化ms-if的逻辑,现在描述DOM的顺序是 ms-skip, ms-important, ms-controller, ms-if ... 只要元素存在ms-skip 这个 ...
随机推荐
- IIS 7.5 使用URL Rewrite模块简单设置网页跳转
原文 IIS 7.5 使用URL Rewrite模块简单设置网页跳转 我们都知道Apache可以在配置文件里方便的设置针对网页或网站的rewrite,但是最近接手了一组IIS服务器,发现这货简单的没有 ...
- WCF消息交换模式之双工通讯(Duplex)
WCF消息交换模式之双工通讯(Duplex) 双工通讯Duplex具有以下特点: 1它可以在处理完请求之后,通过请求客户端中的回调进行响应操作 2.消息交换过程中,服务端和客户端角色会发生调换 3.服 ...
- poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)
题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼 ...
- orleans开篇之hello world
orleans开篇之hello world 什么是orleans Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务.Orleans项目基本上被认为是并行计 ...
- dom02
事件对象:在触发DOM上的事件时dou都会产生一个对象,事件对象event DOM中的事件对象 1)type属性 用于获取事件类型 2)target属性 用于获取事件目标 3)stopPropagat ...
- vim打开出现的文档^M什么
网上公开的一些代码,发现里面多^M符号.这是什么? 我搜索^M没有效果,这应该是一个特殊的控制字符.找换行的结果是不.在每一行的末尾是回车,代替它周围包裹,对于由线定义不同的编码系统是不一样的. li ...
- 从零开始学习jQuery(剧场版) 你必须知道的javascript
原文:从零开始学习jQuery(剧场版) 你必须知道的javascript 一.摘要 本文是jQuery系列教程的剧场版, 即和jQuery这条主线无关, 主要介绍大家平时会忽略的一些javascri ...
- Python 2.7.3的文件编码问题,print在控制台下面中文乱码问题,以及推荐做法
情况:文件乱码,在cmd上输出print也乱码.解决方案:统一为gbk的简体中文编码方式.步骤如下: 1.每个py文件使用[简体中文(GB2312)- 代码页 936]格式保存,行尾为[Windows ...
- linuxsocket通信recv研究缓存机制
曾有过这样一个小疑问.当一个进程注册的插座后,,假设插座没有被调用recv函数接受包.能接受到数据包吗? 或者这样说,假设我的程序注冊了一个套接字去接受数据包,可是每收到一个数据包都须要非常长 ...
- 系统预定义委托与Lambda表达式
NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式 开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Fun ...