迷你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进行讨论,此群为技术群,禁水!

 
 
 
标签: javascript, avalon

迷你MVVM框架 avalonjs 0.82发布的更多相关文章

  1. 迷你MVVM框架 avalonjs 0.95发布

    迷你MVVM框架 avalonjs 0.95发布 本版本最主要的改进是ms-with 深层绑定的实现,至少,avalon1.0所有重要的feature已经开发完毕,之后就是小补小漏,性能优化了. ms ...

  2. 迷你MVVM框架 avalonjs 0.85发布

    迷你MVVM框架 avalonjs 0.85发布 本版本对循环绑定做了巨大改进,感谢@soom, @limodou, @ztz, @Gaubee 提供的大量测试文件. fix scanNodes, 在 ...

  3. 迷你MVVM框架 avalonjs 0.8发布

    本版本最重要的特性是引进了AMD规范的模块加载器,亦即原来mass Framework 的并行加载器, 不同之处,它引进了requirejs的xxx!风格的插件机制,比如要延迟到DOM树建完时触发,是 ...

  4. 迷你MVVM框架 avalonjs 0.99发布

    在本版本主要是性能优化,添加一些有用的功能(如回调什么的),离成品阶段不远了. 修正 updateViewModel bug 修正监控数组的set方法 bug 添加data-each-rendered ...

  5. 迷你MVVM框架 avalonjs 0.9发布

    本版本最大的改进是引进了ms-with绑定,现在可轻松遍历对象了. 改进列表如下: 重新使用082的scanNodes方法,因为有关旧式IE下UI渲染锁死的问题已经解决了. 优化each绑定与Coll ...

  6. 迷你MVVM框架 avalonjs 0.91发布

    本版本修了一些BUG与不合理的地方,感谢感谢ztz, 民工精髓, 姚立, qiangtou等人指正. 处理AMD加载 旧式IE下移除script节点内存泄漏的问题 fix firefox 全系列vis ...

  7. 迷你MVVM框架 avalonjs 0.92发布

    本版本最大的改进是引入ms-class的新风格支持,以前的不支持大写类名及多个类名同时操作,新风格支持了.还有对2维监控数组的支持.并着手修复UI框架. 重构 class, hover, active ...

  8. 迷你MVVM框架 avalonjs 0.93发布

    这段时间吸取@limodou, @东灵等人的意见,做了以下改进 重构isArrayLike,提高avalon.each的性能,原来avalon.each是依赖于isArrayLike来判定是循环普通对 ...

  9. 迷你MVVM框架 avalonjs 0.94发布

    本版本主要做了如下改进: 优化ms-if的逻辑,现在描述DOM的顺序是 ms-skip, ms-important, ms-controller, ms-if ... 只要元素存在ms-skip 这个 ...

随机推荐

  1. 基于 自己定义注解 和 aop 实现使用memcache 对数据库的缓存 演示样例

    好久没更新blog了,在新公司打拼了两个月,每天都从早忙到晚,学到了非常多东西,可是没有时间来更新blog了.... 以下開始解说这次的主题 公司老大让我研究 ocs 就是阿里云的 开放缓存服务 点击 ...

  2. MVC验证07-自定义Model级别验证

    原文:MVC验证07-自定义Model级别验证 在一般的自定义验证特性中,我们通过继承ValidationAttribute,实现IClientValidatable,只能完成对某个属性的自定义验证. ...

  3. 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t

    nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...

  4. iOS--Swift开发中的单例设计模式

    最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...

  5. Android-Universal-Image-Loader学习笔记(两)--LruDiscCache

    最近最少使用缓存官员最近(LruDiscCache)之前,引入一个概念,一个重要的三个班: key:这是DiscCacheAware接口save里面的方法imageUri通过调用参数FileNameG ...

  6. c#兼容 PHP中的md5

    原文:c#兼容 PHP中的md5 由于工作需要,需要使用C#去对一个php程序做二次开发.在登录验证的时候,发现一个小问题. 就是用C#写的md5算法得出的结果和php的md5()得出的结果有时候会不 ...

  7. 快速构建Windows 8风格应用19-基础控件II

    原文:快速构建Windows 8风格应用19-基础控件II 本篇博文接着上篇博文<快速构建Windows 8风格应用18-基础控件I>介绍开发Windows 8风格应用中常用控件. Sli ...

  8. OCP-1Z0-051-题目解析-第10题

    10. View the Exhibit and examine the structure of the PROMOTIONS table. Each promotion has a duratio ...

  9. POJ Big Christmas Tree(最短的基础)

    Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...

  10. iOS_1_加法器

    : BeyondViewController.h // // BeyondViewController.h // 01_calc // // Created by beyond on 14-7-20. ...