VM中以 $开头的属性 都是框架保留使用的特殊属性 ,大家为数据起名字时要小心避开
这些以$开头的属性,目前除了 $id, $events, $watch, $fire, $model比较稳定外, 其他系统属性在不同版本存在增删的情况.
- $id :vm的名字
- $watch : 用于添加监听函数
- $fire : 用于触发监听函数
- $events:用于储存监听函数
- $model :返回一个纯净的JS对象
- $element: 2.0新增, 当我们用ms-controller, ms-important指定一个VM的作用域,对应元素节点会放到这个属性上.
- $computed: 2.2.1新增,用来集中定义计算属性
另外,avalon在VBScript或Object.defineProperty模式下不支持 追加新属性与方法
var vm = avalon.define({ $id: "test", test1: "点击测试按钮没反应 绑定失败" }) vm.aaa = 'newProp' vm.newMethod = function () { //不能再追加此方法 vm.test1 = "绑定成功" }
但我们可以通过以下方式,实现添加子属性。
var vm = avalon.define({ $id: "test", placehoder: {} }); setTimeout(function () { vm.placehoder = {//我们必须要通过 = ,直接添加一个对象来添加子属性, 不能 aaa: 1, //vm.placehoder.aaa =1; vm.placehoder.bbb = 2这样分散地添加子属性 bbb: 2 } }, 1000)
但在firefox4与chrome50后,浏览器支持Proxy对象,可以完美监听对象的增删改查,因此可以动态添加属性或方法
大家可以在浏览器控制台下敲入window.Proxy来知晓支持情况,也可以 通过avalon.config.inProxyMode来开闭此特性. 这个模式暂时只用于avalon.modern.js文件
VM中的数据更新,只能通过 = 赋值方式实现。但要注意在IE6-8,由于VM是一个VBScript对象,为VM添加新属性会抛错, 因此我们想批量更新属性要时格外小心了,需要用hasOwnProperty进行过滤。
注意在IE6-8 下,err是VBscript的关键字,VM中存在这个字段,就会将VM中的其他数组变成字符串,详见这里
为了性能起见,请确保你的对象结构足够扁平,套嵌层次不能太深,里面的数组不能太长。