MVVM ÊÇModel-View-ViewModel µÄËõд£¬ËüÊÇÒ»ÖÖ»ùÓÚÇ°¶Ë¿ª·¢µÄ¼Ü¹¹Ä£Ê½£¬ÆäºËÐÄÊÇÌṩ¶ÔView ºÍ ViewModel µÄË«ÏòÊý¾Ý°ó¶¨£¬ÕâʹµÃViewModel µÄ״̬¸Ä±ä¿ÉÒÔ×Ô¶¯´«µÝ¸ø View£¬¼´ËùνµÄÊý¾ÝË«Ïò°ó¶¨¡£
Vue.js ÊÇÒ»¸öÌṩÁË MVVM ·ç¸ñµÄË«ÏòÊý¾Ý°ó¶¨µÄ Javascript ¿â£¬×¨×¢ÓÚView ²ã¡£ËüµÄºËÐÄÊÇ MVVM ÖÐµÄ VM£¬Ò²¾ÍÊÇ ViewModel¡£ ViewModel¸ºÔðÁ¬½Ó View ºÍ Model£¬±£Ö¤ÊÓͼºÍÊý¾ÝµÄÒ»ÖÂÐÔ£¬ÕâÖÖÇáÁ¿¼¶µÄ¼Ü¹¹ÈÃÇ°¶Ë¿ª·¢¸ü¼Ó¸ßЧ¡¢±ã½Ý¡£
Ϊʲô»á³öÏÖ MVVM ÄØ£¿
ÎÒ½Ó´¥MVVM ÊÇÔÚ2015Ä꣬¿ÉÒÔ˵2015ÄêÊÇMVVM ×î»ðÈȵÄÒ»Ä꣬¶øÔÚÕâ֮ǰ£¬ÎÒËùÖªµÀµÄ¾ÍÊÇMVC, MVC ´óÔ¼ÊÇÔÚ5ÄêÇ°£¬Ò²¾ÍÊÇ2011ÄêµÄʱºò½Ó´¥µÄ£¬ÄÇʱºò¸Õѧ±à³ÌÓïÑÔ£¬Ñ§µÄJava£¬¶øJava ÖоµäµÄ SSH ¿ò¼Ü¾ÍÓÃÀ´¹¹½¨Ò»¸ö±ê×¼µÄMVC ¿ò¼Ü¡£ËµÊµ»°£¬MVC ÓÃÁËÕâô¶àÄ꣬µ«Ê¼ÖÕûÓкÜÉî¿ÌµÄÀí½â£¬Ö»Í£ÁôÔÚÓõIJãÃ棬 Ò»Ö±µ½½Ó´¥ Vue.js Ö®ºó£¬Ñо¿ÁËMVVM ¼Ü¹¹Ë¼Ï룬ȻºóÔÙ»ØÍ·¿´ MVC £¬²ÅÓÐÒ»ÖÖ»íÈ»¿ªÀʵĸоõ~
MVC ¼´ Model-View-Controller µÄËõд£¬¾ÍÊÇ Ä£ÐÍ-ÊÓͼ-¿ØÖÆÆ÷ , Ò²¾ÍÊÇ˵һ¸ö±ê×¼µÄWeb Ó¦ÓóÌʽÊÇÓÉÕâÈý²¿·Ö×é³ÉµÄ£º
View ÓÃÀ´°ÑÊý¾ÝÒÔijÖÖ·½Ê½³ÊÏÖ¸øÓû§ Model Æäʵ¾ÍÊÇÊý¾Ý Controller ½ÓÊÕ²¢´¦ÀíÀ´×ÔÓû§µÄÇëÇ󣬲¢½« Model ·µ»Ø¸øÓû§
ÔÚHTML5 »¹Î´»ðÆðÀ´µÄÄÇЩÄ꣬MVC ×÷ΪWeb Ó¦ÓõÄ×î¼Ñʵ¼ùÊÇOK µÄ£¬ÕâÊÇÒòΪ Web Ó¦ÓõÄView ²ãÏà¶ÔÀ´Ëµ±È½Ï¼òµ¥£¬Ç°¶ËËùÐèÒªµÄÊý¾ÝÔÚºó¶Ë»ù±¾É϶¼¿ÉÒÔ´¦ÀíºÃ£¬View ²ãÖ÷ÒªÊÇ×öÒ»ÏÂչʾ£¬ÄÇʱºòÌᳫµÄÊÇ Controller À´´¦Àí¸´ÔÓµÄÒµÎñÂß¼£¬ËùÒÔView ²ãÏà¶ÔÀ´Ëµ±È½ÏÇáÁ¿£¬¾ÍÊÇËùνµÄÊÝ¿Í»§¶Ë˼Ïë¡£
2010Äêµ½2011Ä꣬HTML5¸ÅÄî±»Èȳ´£¬Êܵ½×·Åõ£¬2012Ä꣬W3C ÕýʽÐû²¼HTML5¹æ·¶ÒѾÕýʽ¶¨¸å¡£2013ÄêÎÒ¸Õ½ø¹«Ë¾¾Í½Ó´¥Á˵ÚÒ»¸ö HTML5 ¿ò¼Ü Sench touch, ËüÊÇÒ»¿îÓÃÀ´¹¹½¨Òƶ¯Ó¦ÓõÄHTML5 ¿ò¼Ü£¬Ëü½«Ç°ºó¶Ë³¹µ×·ÖÀ룬ǰ¶Ë²ÉÓÃMVC ¼Ü¹¹£¬×÷Ϊһ¸ö¶ÀÁ¢µÄÏîÄ¿¹¤³ÌÀ´Î¬»¤¡£
Ϊʲôǰ¶ËÒª¹¤³Ì»¯£¬ÒªÊÇʹÓÃMVC£¿
Ïà¶Ô HTML4 , HTML5 ×î´óµÄÁÁµãÊÇËüΪÒƶ¯É豸ÌṩÁËһЩ·Ç³£ÓÐÓõŦÄÜ£¬Ê¹µÃ HTML5 ¾ß±¸ÁË¿ª·¢AppµÄÄÜÁ¦, HTML5¿ª·¢App ×î´óµÄºÃ´¦¾ÍÊÇ¿çƽ̨¡¢¿ìËÙµü´úºÍÉÏÏߣ¬½ÚÊ¡ÈËÁ¦³É±¾ºÍÌá¸ßЧÂÊ£¬Òò´ËºÜ¶àÆóÒµ¿ªÊ¼¶Ô´«Í³µÄApp½øÐиÄÔ죬Öð½¥ÓÃH5´úÌæNative£¬µ½2015ÄêµÄʱºò£¬ÊÐÃæÉÏ´ó¶àÊýApp »ò¶à»òÉÙǶÈ붼ÁËH5 µÄÒ³Ãæ¡£
¼ÈȻҪÓÃH5 À´¹¹½¨ App, ÄÇView ²ãËù×öµÄÊ£¬¾Í²»½ö½öÊǼòµ¥µÄÊý¾ÝչʾÁË£¬Ëü²»½öÒª¹ÜÀí¸´ÔÓµÄÊý¾Ý״̬£¬»¹Òª´¦ÀíÒƶ¯É豸Éϸ÷ÖÖ²Ù×÷ÐÐΪµÈµÈ¡£Òò´Ë£¬Ç°¶ËÒ²ÐèÒª¹¤³Ì»¯£¬Ò²ÐèÒªÒ»¸öÀàËÆÓÚMVC µÄ¿ò¼ÜÀ´¹ÜÀíÕâЩ¸´ÔÓµÄÂß¼£¬Ê¹¿ª·¢¸ü¼Ó¸ßЧ¡£ µ«ÕâÀïµÄ MVC ÓÖÉÔ΢·¢Á˵ã±ä»¯£º
View UI²¼¾Ö£¬Õ¹Ê¾Êý¾Ý Model ¹ÜÀíÊý¾Ý Controller ÏìÓ¦Óû§²Ù×÷£¬²¢½« Model ¸üе½ View ÉÏ
ÕâÖÖ MVC ¼Ü¹¹Ä£Ê½¶ÔÓÚ¼òµ¥µÄÓ¦ÓÃÀ´¿´ÆðÊÇOK µÄ£¬Ò²·ûºÏÈí¼þ¼Ü¹¹µÄ·Ö²ã˼Ïë¡£ µ«Êµ¼ÊÉÏ£¬Ëæ×ÅH5 µÄ²»¶Ï·¢Õ¹£¬ÈËÃǸüÏ£ÍûʹÓÃH5 ¿ª·¢µÄÓ¦ÓÃÄܺÍNative æÇÃÀ£¬»òÕß½Ó½üÓÚÔÉúApp µÄÌåÑéЧ¹û£¬ÓÚÊÇÇ°¶ËÓ¦Óõĸ´Ôӳ̶ÈÒѲ»Í¬ÍùÈÕ£¬½ñ·ÇÎô±È¡£Õâʱǰ¶Ë¿ª·¢¾Í±©Â¶³öÁËÈý¸öÍ´µãÎÊÌ⣺
1. ¿ª·¢ÕßÔÚ´úÂëÖдóÁ¿µ÷ÓÃÏàͬµÄ DOM API, ´¦Àí·±Ëö £¬²Ù×÷ÈßÓ࣬ʹµÃ´úÂëÄÑÒÔά»¤¡£
2. ´óÁ¿µÄDOM ²Ù×÷ʹҳÃæäÖȾÐÔÄܽµµÍ£¬¼ÓÔØËٶȱäÂý£¬Ó°ÏìÓû§ÌåÑé¡£
3. µ± Model Ƶ·±·¢Éú±ä»¯£¬¿ª·¢ÕßÐèÒªÖ÷¶¯¸üе½View £»µ±Óû§µÄ²Ù×÷µ¼Ö Model ·¢Éú±ä»¯£¬¿ª·¢ÕßͬÑùÐèÒª½«±ä»¯µÄÊý¾Ýͬ²½µ½Model ÖУ¬
ÕâÑùµÄ¹¤×÷²»½ö·±Ëö£¬¶øÇÒºÜÄÑά»¤¸´ÔÓ¶à±äµÄÊý¾Ý״̬¡£
Æäʵ£¬ÔçÆÚjquery µÄ³öÏÖ¾ÍÊÇΪÁËÇ°¶ËÄܸü¼ò½àµÄ²Ù×÷DOM ¶øÉè¼ÆµÄ£¬µ«ËüÖ»½â¾öÁ˵ÚÒ»¸öÎÊÌ⣬ÁíÍâÁ½¸öÎÊÌâʼÖÕ°éËæ×ÅÇ°¶ËÒ»Ö±´æÔÚ¡£
MVVM µÄ³öÏÖ£¬ÍêÃÀ½â¾öÁËÒÔÉÏÈý¸öÎÊÌâ¡£
MVVM ÓÉ Model,View,ViewModel Èý²¿·Ö¹¹³É£¬Model ²ã´ú±íÊý¾ÝÄ£ÐÍ£¬Ò²¿ÉÒÔÔÚModelÖж¨ÒåÊý¾ÝÐ޸ĺͲÙ×÷µÄÒµÎñÂß¼£»View ´ú±íUI ×é¼þ£¬Ëü¸ºÔð½«Êý¾ÝÄ£ÐÍת»¯³ÉUI Õ¹ÏÖ³öÀ´£¬ViewModel ÊÇÒ»¸öͬ²½View ºÍ ModelµÄ¶ÔÏó¡£
ÔÚMVVM¼Ü¹¹Ï£¬View ºÍ Model Ö®¼ä²¢Ã»ÓÐÖ±½ÓµÄÁªÏµ£¬¶øÊÇͨ¹ýViewModel½øÐн»»¥£¬Model ºÍ ViewModel Ö®¼äµÄ½»»¥ÊÇË«ÏòµÄ£¬ Òò´ËView Êý¾ÝµÄ±ä»¯»áͬ²½µ½ModelÖУ¬¶øModel Êý¾ÝµÄ±ä»¯Ò²»áÁ¢¼´·´Ó¦µ½View ÉÏ¡£
ViewModel ͨ¹ýË«ÏòÊý¾Ý°ó¶¨°Ñ View ²ãºÍ Model ²ãÁ¬½ÓÁËÆðÀ´£¬¶øView ºÍ Model Ö®¼äµÄͬ²½¹¤×÷ÍêÈ«ÊÇ×Ô¶¯µÄ£¬ÎÞÐèÈËΪ¸ÉÉ棬Òò´Ë¿ª·¢ÕßÖ»Ðè¹Ø×¢ÒµÎñÂß¼£¬²»ÐèÒªÊÖ¶¯²Ù×÷DOM, ²»ÐèÒª¹Ø×¢Êý¾Ý״̬µÄͬ²½ÎÊÌ⣬¸´ÔÓµÄÊý¾Ý״̬ά»¤ÍêÈ«ÓÉ MVVM À´Í³Ò»¹ÜÀí¡£
Vue.js µÄϸ½Ú
Vue.js ¿ÉÒÔ˵ÊÇMVVM ¼Ü¹¹µÄ×î¼Ñʵ¼ù£¬×¨×¢ÓÚ MVVM ÖÐµÄ ViewModel£¬²»½ö×öµ½ÁËÊý¾ÝË«Ïò°ó¶¨£¬¶øÇÒÒ²ÊÇÒ»¿îÏà¶ÔÀ´±È½ÏÇáÁ¿¼¶µÄJS ¿â£¬API ¼ò½à£¬ºÜÈÝÒ×ÉÏÊÖ¡£VueµÄ»ù´¡ÖªÊ¶ÍøÉÏÓÐÏֳɵĽ̳̣¬´Ë´¦²»ÔÙ׸Êö£¬ ÏÂÃæ¼òµ¥Á˽âһϠVue.js ¹ØÓÚË«Ïò°ó¶¨µÄһЩʵÏÖϸ½Ú£º
Vue.js ÊDzÉÓà Object.defineProperty µÄ getter ºÍ setter£¬²¢½áºÏ¹Û²ìÕßģʽÀ´ÊµÏÖÊý¾Ý°ó¶¨µÄ¡£µ±°ÑÒ»¸öÆÕͨ Javascript ¶ÔÏ󴫸ø Vue ʵÀýÀ´×÷ΪËüµÄ data Ñ¡Ïîʱ£¬Vue ½«±éÀúËüµÄÊôÐÔ£¬Óà Object.defineProperty ½«ËüÃÇתΪ getter/setter¡£Óû§¿´²»µ½ getter/setter£¬µ«ÊÇÔÚÄÚ²¿ËüÃÇÈà Vue ×·×ÙÒÀÀµ£¬ÔÚÊôÐÔ±»·ÃÎʺÍÐÞ¸Äʱ֪ͨ±ä»¯¡£
Observer Êý¾Ý¼àÌýÆ÷£¬Äܹ»¶ÔÊý¾Ý¶ÔÏóµÄËùÓÐÊôÐÔ½øÐмàÌý£¬ÈçÓб䶯¿ÉÄõ½×îÐÂÖµ²¢Í¨Öª¶©ÔÄÕߣ¬ÄÚ²¿²ÉÓÃObject.definePropertyµÄgetterºÍsetterÀ´ÊµÏÖ Compile Ö¸Áî½âÎöÆ÷£¬ËüµÄ×÷ÓöÔÿ¸öÔªËؽڵãµÄÖ¸Áî½øÐÐɨÃèºÍ½âÎö£¬¸ù¾ÝÖ¸ÁîÄ£°åÌæ»»Êý¾Ý£¬ÒÔ¼°°ó¶¨ÏàÓ¦µÄ¸üк¯Êý Watcher ¶©ÔÄÕߣ¬ ×÷ΪÁ¬½Ó Observer ºÍ Compile µÄÇÅÁº£¬Äܹ»¶©ÔIJ¢ÊÕµ½Ã¿¸öÊôÐԱ䶯µÄ֪ͨ£¬Ö´ÐÐÖ¸Áî°ó¶¨µÄÏàÓ¦»Øµ÷º¯Êý Dep ÏûÏ¢¶©ÔÄÆ÷£¬ÄÚ²¿Î¬»¤ÁËÒ»¸öÊý×飬ÓÃÀ´ÊÕ¼¯¶©ÔÄÕߣ¨Watcher£©£¬Êý¾Ý±ä¶¯´¥·¢notify º¯Êý£¬ÔÙµ÷Óö©ÔÄÕßµÄ update ·½·¨
´ÓͼÖпÉÒÔ¿´³ö£¬µ±Ö´ÐÐ new Vue() ʱ£¬Vue ¾Í½øÈëÁ˳õʼ»¯½×¶Î£¬Ò»·½ÃæVue »á±éÀú data Ñ¡ÏîÖеÄÊôÐÔ£¬²¢Óà Object.defineProperty ½«ËüÃÇתΪ getter/setter£¬ÊµÏÖÊý¾Ý±ä»¯¼àÌý¹¦ÄÜ£»ÁíÒ»·½Ã棬Vue µÄÖ¸Áî±àÒëÆ÷Compile ¶ÔÔªËؽڵãµÄÖ¸Áî½øÐÐɨÃèºÍ½âÎö£¬³õʼ»¯ÊÓͼ£¬²¢¶©ÔÄWatcher À´¸üÐÂÊÓͼ£¬ ´ËʱWather »á½«×Ô¼ºÌí¼Óµ½ÏûÏ¢¶©ÔÄÆ÷ÖÐ(Dep),³õʼ»¯Íê±Ï¡£
µ±Êý¾Ý·¢Éú±ä»¯Ê±£¬Observer ÖÐµÄ setter ·½·¨±»´¥·¢£¬setter »áÁ¢¼´µ÷ÓÃDep.notify()£¬Dep ¿ªÊ¼±éÀúËùÓеĶ©ÔÄÕߣ¬²¢µ÷Óö©ÔÄÕßµÄ update ·½·¨£¬¶©ÔÄÕßÊÕµ½Í¨Öªºó¶ÔÊÓͼ½øÐÐÏàÓ¦µÄ¸üС£
ÒÔÉÏÄÚÈÝÊÇÎÒÔÚ´ó°ëÄêµÄÏîĿʵ¼ùÖ®ºó£¬¶ÔMVVM ºÍ Vue.js µÄÒ»µãµã¼òµ¥ÈÏʶºÍ×ܽᣬϣÍû¶Ô¸÷λÓÐËù°ïÖú£¡
@by Ò»ÏñËØ 2016.11
¡¡