@@ -992,54 +992,51 @@ var findNodes = DOC.querySelectorAll ? function(str) {
992992 **********************************************************************/
993993var 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}
14301423function 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