Skip to content

Commit fd8d49a

Browse files
author
qincheng.zhong
committed
简化 object的处理
1 parent 0b6f77d commit fd8d49a

16 files changed

+488
-1021
lines changed

avalon.js

Lines changed: 53 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -992,54 +992,51 @@ var findNodes = DOC.querySelectorAll ? function(str) {
992992
**********************************************************************/
993993
var EventBus = {
994994
$watch: function (type, callback) {
995-
var that = IEVersion && (typeof me == "undefined") ? me : this
996995
if (typeof callback === "function") {
997-
var callbacks = that.$events[type]
996+
var callbacks = this.$events[type]
998997
if (callbacks) {
999998
callbacks.push(callback)
1000999
} else {
1001-
that.$events[type] = [callback]
1000+
this.$events[type] = [callback]
10021001
}
10031002
} else { //重新开始监听此VM的第一重简单属性的变动
1004-
that.$events = that.$watch.backup
1003+
this.$events = this.$watch.backup
10051004
}
1006-
return that
1005+
return this
10071006
},
10081007
$unwatch: function (type, callback) {
1009-
var that = IEVersion && (typeof me == "undefined") ? me : this
10101008
var n = arguments.length
10111009
if (n === 0) { //让此VM的所有$watch回调无效化
1012-
that.$watch.that = that.$events
1013-
that.$events = {}
1010+
this.$watch.backup = this.$events
1011+
this.$events = {}
10141012
} else if (n === 1) {
1015-
that.$events[type] = []
1013+
this.$events[type] = []
10161014
} else {
1017-
var callbacks = that.$events[type] || []
1015+
var callbacks = this.$events[type] || []
10181016
var i = callbacks.length
10191017
while (~--i < 0) {
10201018
if (callbacks[i] === callback) {
10211019
return callbacks.splice(i, 1)
10221020
}
10231021
}
10241022
}
1025-
return that
1023+
return this
10261024
},
10271025
$fire: function (type) {
1028-
var that = IEVersion && (typeof me == "undefined") ? me : this
10291026
var special, i, v, callback
10301027
if (/^(\w+)!(\S+)$/.test(type)) {
10311028
special = RegExp.$1
10321029
type = RegExp.$2
10331030
}
1034-
var events = that.$events
1031+
var events = this.$events
10351032
if (!events)
10361033
return
10371034
var args = aslice.call(arguments, 1)
10381035
var detail = [type].concat(args)
10391036
if (special === "all") {
10401037
for (i in avalon.vmodels) {
10411038
v = avalon.vmodels[i]
1042-
if (v !== that) {
1039+
if (v !== this) {
10431040
v.$fire.apply(v, detail)
10441041
}
10451042
}
@@ -1049,7 +1046,7 @@ var EventBus = {
10491046
return
10501047
for (i in avalon.vmodels) {
10511048
v = avalon.vmodels[i]
1052-
if (v !== that) {
1049+
if (v !== this) {
10531050
if (v.$events.expr) {
10541051
var eventNodes = findNodes(v.$events.expr)
10551052
if (eventNodes.length === 0) {
@@ -1092,16 +1089,15 @@ var EventBus = {
10921089
var all = events.$all || []
10931090
for (i = 0; callback = callbacks[i++]; ) {
10941091
if (isFunction(callback))
1095-
callback.apply(that, args)
1092+
callback.apply(this, args)
10961093
}
10971094
for (i = 0; callback = all[i++]; ) {
10981095
if (isFunction(callback))
1099-
callback.apply(that, arguments)
1096+
callback.apply(this, arguments)
11001097
}
11011098
}
11021099
}
11031100
}
1104-
11051101
/*********************************************************************
11061102
* modelFactory *
11071103
**********************************************************************/
@@ -1205,13 +1201,18 @@ function modelFactory(source, $special, $model) {
12051201
hideProperty($vmodel, "$model", $model)
12061202
hideProperty($vmodel, "$events", $events)
12071203
/* jshint ignore:start */
1208-
hideProperty($vmodel, "hasOwnProperty", function () {
1209-
var that = IEVersion && (typeof me == "undefined") ? me : this
1210-
return name in that.$model
1211-
})
1204+
if (canHideOwn) {
1205+
hideProperty($vmodel, "hasOwnProperty", function (name) {
1206+
return name in $vmodel.$model
1207+
})
1208+
} else {
1209+
$vmodel.hasOwnProperty = function (name) {
1210+
return (name in $vmodel.$model) && (name !== "hasOwnProperty")
1211+
}
1212+
}
12121213
/* jshint ignore:end */
1213-
for (var i in EventBus) {
1214-
hideProperty($vmodel, i, EventBus[i])
1214+
for ( i in EventBus) {
1215+
hideProperty($vmodel, i, EventBus[i].bind($vmodel))
12151216
}
12161217

12171218
$vmodel.$reinitialize = function () {
@@ -1344,24 +1345,16 @@ function makeComplexAccessor(name, initValue, valueType, list, parentModel) {
13441345
delete a.$lock
13451346
a._fire("set")
13461347
} else if (valueType === "object") {
1347-
if (keysVM(son).join(";") === keysVM(value).join(";")) {
1348-
for (var i in value) {// jshint ignore:line
1349-
son[i] = value[i]
1350-
}
1351-
} else {
1352-
var sson = accessor._vmodel = modelFactory(value, 0, son.$model)
1353-
var sevent = sson.$events
1354-
var oevent = son.$events
1355-
for (var i in oevent) {// jshint ignore:line
1356-
var arr = oevent[i]
1357-
if (Array.isArray(sevent[i])) {
1358-
sevent[i] = sevent[i].concat(arr)
1359-
} else {
1360-
delete sson.$model[i]
1348+
var observes = this.$events[name] || []
1349+
son = accessor._vmodel = modelFactory(value)
1350+
son.$events[subscribers] = observes
1351+
if (observes.length) {
1352+
observes.forEach(function (data) {
1353+
if (data.rollback) {
1354+
data.rollback() //还原 ms-with ms-on
13611355
}
1362-
}
1363-
sevent[subscribers] = oevent[subscribers]
1364-
son = sson
1356+
bindingHandlers[data.type](data, data.vmodels)
1357+
})
13651358
}
13661359
}
13671360
accessor.updateValue(this, son.$model)
@@ -1428,7 +1421,7 @@ function isObservable(name, value, $skipArray) {
14281421
return true
14291422
}
14301423
function keysVM(obj) {
1431-
var arr = Object.keys(obj)
1424+
var arr = Object.keys(obj.$model ? obj.$model: obj)
14321425
for (var i = 0; i < $$skipArray.length; i++) {
14331426
var index = arr.indexOf($$skipArray[i])
14341427
if (index !== -1) {
@@ -4234,6 +4227,7 @@ bindingExecutors.repeat = function (method, pos, el) {
42344227
if (!method && data.xtype) {
42354228
var old = data.$repeat
42364229
var neo = data.evaluator.apply(0, data.args || [])
4230+
42374231
if (data.xtype === "array") {
42384232
if (old.length === neo.length) {
42394233
return
@@ -4284,9 +4278,10 @@ bindingExecutors.repeat = function (method, pos, el) {
42844278
sweepNodes(start, end)
42854279
if (data.xtype === "object") {
42864280
parent.insertBefore(start, end)
4281+
}else{
4282+
recycleProxies(proxies, "each")
42874283
}
42884284
}
4289-
recycleProxies(proxies, "each")
42904285
break
42914286
case "move":
42924287
start = comments[0]
@@ -4328,91 +4323,39 @@ bindingExecutors.repeat = function (method, pos, el) {
43284323
break
43294324
case "append":
43304325
var object = data.$repeat //原来第2参数, 被循环对象
4326+
var pool = Array.isArray(proxies) ||!proxies ? {}: proxies //代理对象组成的hash
4327+
data.proxies = pool
43314328
var keys = []
4332-
//用于放置 所有代理VM
4333-
data.proxies = data.proxies || {}
4334-
var pool = data.proxies
4335-
4336-
//收集所有要移除的节点,除了第一个与最后一个注释节点
4337-
removed = []
4338-
var nodes = data.element.parentNode.childNodes
4339-
var add = false
4340-
for (i = 0; node = nodes[i++]; ) {
4341-
if (node.nodeValue === data.signature) {
4342-
add = true
4343-
} else if (node.nodeValue === data.signature + ":end") {
4344-
add = false
4345-
}
4346-
if (add) {
4347-
removed.push(node)
4348-
}
4349-
}
4350-
4351-
var indexNode = [], item
4352-
var keyIndex = data.keyIndex || (data.keyIndex = {})
4353-
//将现有的节点全部移出DOM树
4354-
for (i = 0; i < removed.length; i++) {
4355-
el = removed[i]
4356-
if (el.nodeValue === data.signature) {
4357-
item = avalonFragment.cloneNode(false)
4358-
indexNode.push(item)
4329+
fragments = []
4330+
for (var key in pool) {
4331+
if (!object.hasOwnProperty(key)) {
4332+
proxyRecycler(pool[key], withProxyPool) //去掉之前的代理VM
4333+
delete(pool[key])
43594334
}
4360-
item.appendChild(el)
43614335
}
4362-
4363-
//收集当前所有用户添加的键名(不包括框架架上的$xxxx)
4364-
for (var key in object) {
4336+
for (key in object) { //得到所有键名
43654337
if (object.hasOwnProperty(key) && key !== "hasOwnProperty") {
43664338
keys.push(key)
43674339
}
43684340
}
4369-
//为pool添加代理VM
4370-
for (i = 0; key = keys[i++]; ) {
4371-
if (!pool.hasOwnProperty(key)) {
4372-
//如果不存在就从withProxyPool中拿,再不存在就创建
4373-
pool[key] = withProxyAgent(pool[key], key, data)
4374-
} else {//存在就重写$val
4375-
pool[key].$val = object[key]
4376-
}
4377-
}
4378-
//从pool中删除不再使用代理VM
4379-
for (key in pool) {
4380-
if (keys.indexOf(key) === -1) {
4381-
delete keyIndex[key]
4382-
proxyRecycler(pool[key], withProxyPool) //去掉之前的代理VM
4383-
delete pool[key]
4384-
}
4385-
}
4386-
fragments = []
4387-
var renderKeys = keys //需要渲染到DOM树去的键名
43884341
if (data.sortedCallback) { //如果有回调,则让它们排序
43894342
var keys2 = data.sortedCallback.call(parent, keys)
4390-
if (keys2 && Array.isArray(keys2)) {
4391-
renderKeys = keys2
4343+
if (keys2 && Array.isArray(keys2) && keys2.length) {
4344+
keys = keys2
43924345
}
43934346
}
4394-
4395-
for (i = 0; i < renderKeys.length; i++) {
4396-
key = renderKeys[i]
4397-
if (indexNode[keyIndex[key]]) {//重用已有节点
4398-
transation.appendChild(indexNode[keyIndex[key]])
4399-
fragments.push({})
4400-
} else {
4347+
for (i = 0; key = keys[i++]; ) {
4348+
if (key !== "hasOwnProperty") {
4349+
pool[key] = withProxyAgent(pool[key], key, data)
44014350
shimController(data, transation, pool[key], fragments)
44024351
}
44034352
}
44044353

4405-
for (i = 0; i < renderKeys.length; i++) {
4406-
keyIndex[renderKeys[i]] = i
4407-
}
44084354
parent.insertBefore(transation, end)
44094355
for (i = 0; fragment = fragments[i++]; ) {
4410-
if (fragment.nodes) {
4411-
scanNodeArray(fragment.nodes, fragment.vmodels)
4412-
fragment.nodes = fragment.vmodels = null
4413-
}
4356+
scanNodeArray(fragment.nodes, fragment.vmodels)
4357+
fragment.nodes = fragment.vmodels = null
44144358
}
4415-
44164359
break
44174360
}
44184361
if (!data.$repeat || data.$repeat.hasOwnProperty("$lock")) //IE6-8 VBScript对象会报错, 有时候data.$repeat不存在

0 commit comments

Comments
 (0)