avalonJS-ソース読み(三)VMODEL
12025 ワード
avalon 。 vmodel 。 ps: , , 。 :
[-]
avalon dom
avalon Observable
avalon modelFactory
loopModel
isEqual
avalon dom
, avalon dom 。 :avalon scan dom。 ms-import ms-container ms-include ms-skip
VMODELS , , registerSubscriber , dom 。
, 。
//VMODULE , , , object , object
// {
// a:{
// b:" "
// }
// }
//
{
$id:$string,//define , ,
$model:$obj,//define vm。 , $model
$watch:$fn,
$unwatch:$fn,
$fire:$fn,// Observable , 。
$skipArray:true|$array,//
hasOwnProperty:$fn,// , $model
$accessors:$obj, 。
$event:$obj,// $watch
get ...:$fn,
set ...:$fn,
...:...// defineProperty model
}
//$accessors,
{
$modelName:$fn //$fn[subscribers] =[" "]
$vmodel:$obj// ,
}
avalon vmodel , , (Subscribe/Publish), 。
avalon , , model view model 。 Observable。 java
, , , 。
, , 。
, 。
function registerSubscriber(data) {
Registry[expose] = data // , collectSubscribers
avalon.openComputedCollect = true
var fn = data.evaluator
if (fn) { //
if (data.type === "duplex") {
data.handler()
} else {
data.handler(fn.apply(0, data.args), data.element, data)
}
} else { // accessor
data()
}
avalon.openComputedCollect = false
delete Registry[expose]
}
function collectSubscribers(accessor) { //
if (Registry[expose]) {
var list = accessor[subscribers]
list && avalon.Array.ensure(list, Registry[expose])// push
}
}
,accessor [subscribes] , 。
registerSubscriber Registry[expose] = data delete Registry[expose] ,collectSubscribers ?
descriptorFactory Object.defineProperty 。 Object.defineProperty , 。
var a={};
Object.defineProperty(a,"a",{
get:function(){
console.log("get a")
return " "
},
set:function(val){
console.log("set a")
value=val;
}
});
console.log(a.a);
console.log(a.a="new value")
console.log(a.a);
// get a
//
// set a
// new value
// get a
//
var memeryValue=" ";//we need to save the value in some where
Object.defineProperty(a,"b",{
get:function(){
console.log("get b")
return memeryValue
},
set:function(val){
console.log("set b")
memeryValue=val;
}
});
console.log(a.b);
console.log(a.b="new value")
console.log(a.b);
// get b
//
// set b
// new value
// get b
// new value
, , get/set , vmodel , ( avalon ,
accessor )。
notifySubscribers , accessor , 。
avalon Observable
Observable 。 , $watch、$unwacth、$fire。 $events vm ( vm ,
)。 $watch $unwacth ,fire avalon 。
$events 。
:"$events" {"modelValue":undefined},
accessor 。
//name='abc'
var backup = vmodel.$events[name]// vmodel.$events[name] ,backup undefined
vmodel.$events[name] = []
setter.call(vmodel, newValue)
vmodel.$events[name] = backup// ,{abc:undefined}
, :
var backup = vmodel.$events[name]
vmodel.$events[name] = []
setter.call(vmodel, newValue)
if(backup===undefined)
delete vmodel.$events[name]
else
vmodel.$events[name] = backup
avalon modelFactory
modelFactory loopModel descriptorFactory。
loopModel
loopModel , avalon 5 。
model , avalon 。 java entity, , ,avalon 。
normalProperties , , $skipArray , $ , avalon ($event, $watch )。
accessingProperties , 。
watchProperties , $ , , avalon $event 。 normalProperties , , 。
computedProperties , set get 。 accessingProperties 。
loopModel vm object , accessor。
accessor, dom dom (notifySubscribers) (safeFire)。
accessingProperties、computedProperties accessor。
object accessor 。 , modelFactory VMODULE , , ,
,avalon.vmodels $model 。 updateWithProxy、updateVModel , 。
isEqual
var isEqual = Object.is || function(v1, v2) {
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2
} else if (v1 !== v1) {
return v2 !== v2
} else {
return v1 === v2
}
}// ,
avalon 。 。 , 《javascript 》,
, bug , , Jser ( , )。