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    (        ,      )。