avalon是一款基于 Object.defineProperty 与 VBScript 实现属性监控变动的 MVVM 框架,因此性能比基于脏检测的 angular 来得更好,使用方法也比基于属性转函数的 knockout 来得直接便捷。简单易用易上手兼容性好的是其最大的特点。
下面是详细介绍:
将项目下载到本地,里面有一个叫 server.exe 的.Net 小型服务器(可以需要安装.Net4.0), 点击它然后打开里面与 index 开头的 HTML 文件,一边看运行效果,一边看源码进行学习。
java -jar compiler.jar --js avalon.js --js_output_file avalon.min.js
java -jar compiler.jar --js avalon.modern.js --js_output_file avalon.modern.min.js
大家也可以在新浪微博第一时间了解它的变更或各种秘笈分享!
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script src="avalon.js"></script>
<script>
avalon.define({
$id: "test",
word: "Hello Avalon"
})
</script>
</head>
<body>
<div ms-controller="test">
<h1>{{word}}!!!!!</h1>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>avalon入门</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="avalon.js" ></script>
<script>
var first = 0;
var model = avalon.define("test", function(vm) {
vm.firstName = "司徒"
vm.lastName = "正美"
vm.fullName = {//一个包含set或get的对象会被当成PropertyDescriptor,
set: function(val) {//里面必须用this指向scope,不能使用scope
var array = (val || "").split(" ");
this.firstName = array[0] || "";
this.lastName = array[1] || "";
},
get: function() {
return this.firstName + " " + this.lastName;
}
}
vm.arr = ["aaa", 'bbb', "ccc", "ddd"]
vm.selected = ["bbb", "ccc"]
vm.checkAllbool = false
vm.checkAll = function() {
if (!first) {
first++
return
}
if (this.checked) {
vm.selected = vm.arr
} else {
vm.selected.clear()
}
}
vm.checkOne = function() {
var bool = this.checked
if (!bool) {
vm.checkAllbool = false
} else {
vm.checkAllbool = vm.selected.size() === vm.arr.length
}
}
})
</script>
</head>
<body>
<div ms-controller="test">
<p>First name: <input ms-duplex="firstName" /></p>
<p>Last name: <input ms-duplex="lastName" /></p>
<p>Hello, <input ms-duplex="fullName"></p>
<div>{{firstName +" | "+ lastName }}</div>
<ul>
<li><input type="checkbox" ms-duplex-radio="checkAllbool" data-duplex-changed="checkAll"/>全选</li>
<li ms-repeat="arr" ><input type="checkbox" ms-value="el" ms-duplex="selected" data-duplex-changed="checkOne"/>{{el}}</li>
</ul>
</div>
</body>
</html>
其绑定属性一览,与 angular, knockout 的指令相很近,学过后两者可以很快上手。
这里还有 TodoMVC 的 avalon 版本学习。
下面是 1.3.7 的更新日志:
javascript
avalon.scanCallback = function(fn, group) {
group = group || "$all"
var array = scanObject[group] || (scanObject[group] = [])
array.push(fn)
}
avalon.scan = function(elem, vmodel, group) {
elem = elem || root
group = group || "$all"
//.....略
}
本次升级主打的是ms-duplex 2.0,大家可以到这里一窥其强大!ms-duplex2.0 相对于旧的 ms-duplex 只能将 element.value 简单地同步到 VM 中,它添加了自动转换类型的功能(核心库),光标引导(avalon.mask),数据格式化(参看 avalon.mask 的第三个例子,将用户输入内容自动插入千分符),验证机制 (avalon.validation)。
第二大新特性就添加了 avalon.scanCallback 这新方法,允许用户在扫描后进行操作。有了这东西,什么 data-include-rendered, data-repeat-rendered, data-with-rendered 就没有存在的必要了。以后它们内部全部用 avalon.scanCallback 实现。
从 1.3.3 起,我就着手开发静态收集依赖机制,以此为契机,发现许多要改良的地方,全部放到一个叫 avalon.$events.js 的版本上。但经过几个月的研究,发现静态收集依赖,是对压缩不友好的,像 angular 那样需要引入许多奇异的方式来规避这问题。因此我最终放弃这东西,以后改用其他方式提高性能。未来将着力升级三柱臣与 avalon.observe.js。
朋友们用 avalon 做的东西
期待大家的加入!