简介
avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是:
使用 observe 模式,性能高。
将原始对象用object.defineProperty重写,不需要用户像用knockout时那样显示定义各种属性。
对低版本的IE使用了VBScript来兼容,一直兼容到IE6。
需要看基础介绍的话建议直接看司徒的博客。在网上搜了一圈,发现已经有了avalon很好的源码分析,这里也推荐一下:地址。 avalon在圈子里一直被诟病不够规范的问题,请各位不必再留言在我这里,看源码无非是取其精华去其糟粕。可以点评,但总是讨论用哪个框架好哪个不好就没什么意义了,若是自己把握不住,用什么都不好。
今天的分析以 avalon.mobile 1.2.5 为准,avalon.mobile 是专门为高级浏览器准备的,不兼容IE8以下。
入口
还是先看启动代码
avalon.ready(function() { avalon.define("box", function(vm) { vm.w = 100; vm.h = 100; vm.area = function(){ get : function(){ return this.w * this.h } } vm.logW =function(){ console.log(vm.w)} }) avalon.scan() })
还是两件事:定义viewModel 和 执行扫描。 翻到define 定义:
avalon.define = function(id, factory) { if (VMODELS[id]) { log("warning: " + id + " 已经存在于avalon.vmodels中") } var scope = { $watch: noop } factory(scope) //得到所有定义 var model = modelFactory(scope) //偷天换日,将scope换为model stopRepeatAssign = true factory(model) stopRepeatAssign = false model.$id = id return VMODELS[id] = model }
其实已经可以一眼看明白了。这里只提一点,为什么要执行两次factory?建议读者先自己想一下。我这里直接说出来了: 因为modelFactory中,如果属性是函数,就会被直接复制到新的model上,但函数内的vm却仍然指向的原来的定义函数的中的vm,因此发生错误。所以通过二次执行factory来修正引用错误。
那为什么不在modelFactory中直接就把通过Function.bind或其他方法来把引用给指定好呢?而且可以在通过scope获得定以后就直接把 scope 对象修改成viewModel就好了啊?
这里的代码写法其实是直接从avalon兼容IE的完整版中搬出来的,因为对老浏览器要创造VBScript对象,所以只能先传个scope进去获取定义,在根据定义去创造。并且老的浏览器也不支持bind等方法。 还是老规矩,我们先看看整体机制图:
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mvvm框架的avalon
, function
, ie源码
, model
, if ie代码不好用
, Factory
, scope
, avalon
, function.bind
, avalon绑定属性
, knockout源码
, 直接
, avalon.js教程
avalon过滤器
vue.js源码解析、sea.js源码解析、js源码解析、angularjs源码解析、reactjs 源码解析,以便于您获取更多的相关知识。