ÎÒÃÇÐèÒªÓõ½Á½¸öavalon·ÓÉÅäÌ×Ä£¿é¡ª¡ª mmHistory.js
ºÍ mmRouter.js ¡£ÆäÖÐmmHistoryÊÇÓÃÓÚÀúÊ·¹ÜÀí£¬Ëü»á½Ù³ÖÒ³ÃæÉÏËùÓеã»÷Á´½ÓµÄÐÐΪ£¬µ±ÕâЩÁ´½ÓÊÇÒÔ
#/ ¡¢#!/ ¿ªÍ·£¬¾Í³¢ÊÔÆ¥Åä·ÓɹæÔò£¬×èÖ¹Ò³ÃæË¢Ð£¨Í¨¹ýhash·½Ê½»òHTML5µÄreplaceState·½Ê½£©¡£mmRouterÊǸøÎÒÃǶ¨Òå·ÓɹæÔò£¬Â·ÓɹæÔò¿ÉÒÔ¸ü¾«Ï¸µØÖ¸¶¨Ã¿¸ö²ÎÊý(param)µÄÆ¥Å乿Ôò£¬Èç¹û·ûºÏ¾ÍÖ´ÐжÔÓ¦µÄ»Øµ÷£¬Èç¹û²»·ûºÏ£¬¾Í½øÈëerror»Øµ÷¡£
¹ØÓڸ÷ÓÉϵͳ¸ü¾ßÌåµÄÃèÊö£¬¿ÉÒÔ²éÔÄÕâÀï¡£
×÷ΪʾÀý£¬ÎÒÃÇ´òËãÖÆ×÷Ò»¸öÍøÕ¾µÄ ¡°Óû§ÖÐÐÄ¡± Ò³Ãæ£¬ÆäÖÐ×ó²àΪµ¼º½ÁÐ±í£¬ÓÒ²àΪÊÜ×ó²àÁÐ±í¿ØÖÆµÄÄÚÈÝÏÔÊ¾ÇøÓò£º

¸Ã¡°Óû§ÖÐÐÄ¡±Ò³ÃæÓÐÕâô¼¸¸öÒªÇó£º
¢Å Ò³Ãæ²»Ìø×ª£¬½ö×ö¾Ö²¿£¨¼´ÄÚÈÝÇøÓò²¿·Ö£©Ë¢Ð£»
¢Æ ¿ÉÒÔͨ¹ý²»Í¬µÄurl½øÈë¶ÔÓ¦µÄÒ³Ãæ£¨¼´ÄÚÈÝÇøÓòÏÔʾ¶ÔÓ¦µÄÄÚÈÝ£©£»
¢Ç ä¯ÀÀÆ÷ÄܼÇסurl״̬£¬±ÈÈç´Ó¡°ÕË»§ÏêÇ顱µãÈë¡°ÎÒÒª³äÖµ¡±Ò³Ã棬ȻºóÔÙµã»÷ä¯ÀÀÆ÷·µ»Ø°´Å¥£¬¿ÉÒÔÕýÈ·»Øµ½¡°ÕË»§ÏêÇé¡±Ò³Ãæ¡£
ÓÉÓÚ²»ÊÇʯÆ÷ʱ´ú£¬×ÔÈ»²»»áÔÙÑ¡ÔñiframeÕâÖÖÄںĸߡ¢²»ÓѺõÄÔªËØÀ´¼Ü¹¹Ò³Ã棨¶øÇÒiframeҲʵÏÖ²»Á˺óÃæÁ½¸öÐèÇóѽ£©¡£ÄÇôÎÒÃÇ»áºÜ¿ìÁªÏëµ½Ajax¼¼Êõ£¬Õâ¸öÏë·¨ºÜ±¾ÖÊ£¬²»¹ýµ¥´¿µÄAjaxҲû°ì·¨´ïµ½ÎÒÃǵÄÒªÇó£¬ËùÒÔ²ÅÐèÒªÒýÈ뿪ͷÌáµ½µÄÁ½¸öavalon·ÓÉÄ£¿é¡£
ÎÒÃÇ¿ÉÒÔÏÈд³ö¼òµ¥µÄÒ³ÃæÔÐÍ£º
index.html£º
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>ÕË»§ÖÐÐÄ</title> <link rel="stylesheet" href="css/user.css"> <script src="js/lib/require.js" type="text/javascript" data-main="js/page/user"></script> </head> <body ms-controller="user" class="ms-controller"> <script type="text/javascript"> //ÕâÀï¸øºó¶ËÌṩÊý¾Ý½Ó¿Ú var conf = { username: {"id": "11", "name": "VaJoy"} } </script> <header> <span>{{username.name}}ÄãºÃ£¬»¶ÓÀ´µ½ÕË»§ÖÐÐÄ</span> </header> <nav> <ul> <li><a href="#!/index">ÎÒµÄÊ×Ò³</a></li> <li><a href="#!/detail">ÕË»§ÏêÇé</a></li> <li><a href="#!/recharge">ÎÒÒª³äÖµ</a></li> </ul> </nav> <article> ÄÚÈÝ... </article> </body> </html> |
user.js£º
require.config({ baseUrl: 'js/lib/', paths:{ avalon: 'avalon', domReady:'domReady', mmHistory: 'mmHistory', mmRouter: 'mmRouter', jquery: 'jq' }, shim:{ avalon: { exports: "avalon" }, mmHistory:{ deps: ['avalon']}, mmRouter:{ deps: ['avalon']} } });
require(['avalon',"domReady!"], function()
{
var vm = avalon.define({
$id: "user",
username:conf.username
});
avalon.scan();
}); |
user.css£º
body,html{padding: 0;margin:0;background: #EEE;} .ms-controller{visibility: hidden;} header{height: 50px;background: white;} header>span{display:block;padding: 16px;} nav{position: absolute;left:0;margin-top:50px;width: 200px;} nav>ul>li{margin-top: 12px;} nav>ul>li>a{text-decoration: none;color:blue;} nav>ul>li>a:hover{color:red;} article{padding: 15px;margin-left:200px;min-height: 600px;background: white;} |
ÔËÐнá¹ûÈçÏ£º

½Ó×ÅÎÒÃÇҪн¨Èý¸öÒ³Ãæ¡ª¡ªmine.html¡¢detail.html ºÍ
recharge.html £¬·Ö±ð¶ÔÓ¦¡°ÎÒµÄÊ×Ò³¡±¡¢¡°ÕË»§ÏêÇ顱 ºÍ ¡°ÎÒÒª³äÖµ¡± µÄÓÒ²àÄÚÈÝ£¬ÔÛÔÚÀïÃæËæ±ãдµãÄÚÈÝÒâ˼Òâ˼¼´¿É£¬±ÈÈçmine.htmlÎÒ¾ÍдÁËÒ»¾ä»°£º

½Ó×ÅÎÒÃÇĬÈÏÏȰÑmine.htmlÒýÈëµ½index.htmlÖУ¬ÕâÀïÎÒÃǽèÖúavalonµÄ
ms-include-src ½Ó¿Ú£¬ÐÞ¸ÄÏÂindex.html£º
<nav> <ul> <li><a href="#!/index">ÎÒµÄÊ×Ò³</a></li> <li><a href="#!/detail">ÕË»§ÏêÇé</a></li> <li><a href="#!/recharge">ÎÒÒª³äÖµ</a></li> </ul> </nav> <article ms-include-src="pageUrl"> <!--ÕâÀïʹÓÃms-include-src½Ó¿Ú£¬Ëü»áÒýÈëpageUrlÊôÐÔËù¶ÔÓ¦µÄÎļþ--> </article> |
½Ó×ÅÐÞ¸Ä user.jsµÄ²¿·Ö£º
require(['avalon',"domReady!"], function() { var vm = avalon.define({ $id: "user", username:conf.username, pageUrl:"mine.html" //ĬÈÏΪmine.html }); avalon.scan(); }); |
ÔËÐÐÈçÏ£º

½Ó×ÅÊÇʱºòÈà mmHistory.js ºÍ mmRouter.js ·¢»ÓËüÃǵÄ×÷ÓÃÁË£¬ÎÒÃÇÐÞ¸ÄÏÂuser.jsµÄ²¿·Ö´úÂ룺
require(['mmHistory','mmRouter',"domReady!"], function() { var vm = avalon.define({ $id: "user", username:conf.username, pageUrl:"mine.html" //ĬÈÏΪmine.html }); function callback() { if(this.path==="/index"){ vm.pageUrl="mine.html"; }else { var path_tail = this.path.replace(/\//, ""); vm.pageUrl = path_tail + ".html"; //¶¯Ì¬ÐÞ¸ÄpageUrlÊôÐÔÖµ } } avalon.router.get("/*path", callback); //½Ù³Öurl hash²¢´¥·¢»Øµ÷ avalon.history.start(); //ÀúÊ·¼Ç¼¶ÑÕ»¹ÜÀí avalon.scan(); }); |
×¢ÒâÓÉÓÚÔÚ require.config µÄ shim ÖÐÎÒÃÇÒѾ¶¨ÒåÁË mmHistory.js ºÍ
mmRouter.js ÊÇÒÀÀµÓÚavalonµÄ£¬¹Ê´Ë´¦ÎÞÐëÔÙÒýÈëavalonÄ£¿é£¬requireJSÖ´ÐиôúÂë¶Î֮ǰ»áÏȼÓÔØºÃavalonµÄ¡£
ÎÒÃÇͨ¹ýÕâÁ½ÐдúÂëÖ´ÐÐÁË·ÓɺÍÀúÊ·¼Ç¼µÄ¹ÜÀí£º
avalon.router.get("/*path", callback); //½Ù³Öurl hash²¢´¥·¢»Øµ÷ avalon.history.start(); //ÀúÊ·¼Ç¼¶ÑÕ»¹ÜÀí |
ÆäÖÐrouter.get() µÄµÚÒ»¸ö²ÎÊý±íʾ·ÓÉÆ¥Å乿Ôò£¬±ÈÈçÕâÀïµÄ¡°/*path¡±±íʾƥÅäÈ«²¿Â·¾¶£¬Æ¥Åäµ½Á˾ʹ¥·¢»Øµ÷callbackº¯Êý¡£
¸ü¶àµÄÆ¥Å乿ÔòÎÒÃÇ¿ÉÒÔÖ±½ÓÔÚ mmRouter.js Öв鿴עÊÍÐÅÏ¢£º

router.get() ÔÚ´¥·¢callbackǰ»áÉú³ÉÒ»¸öthis.pathÊôÐÔ¹©callbackµ÷Óã¨ÄãÒ²¿ÉÒÔ¸ø»Øµ÷º¯Êý¶¨ÒåÒ»¸ö²ÎÊý£¬ÆäĬÈÏÖµµÈͬÓëpath£©£¬ÆäֵΪµ±Ç°Æ¥Åäµ½µÄ·¾¶£¬±ÈÈçµ±urlºó׺±ä³É
#!/recharge µÄʱºò£¬this.pathµÄֵΪƥÅäµ½µÄ"/recharge"
¡£Á˽âÁËÕâ¸öÖ®ºó£¬callback º¯ÊýÒ²ºÜºÃÀí½âÁË£º
function callback() { if(this.path==="/index"){ vm.pageUrl="mine.html"; //Èç¹ûurlºó׺±ä³É"#!/index"£¬ÔòpageUrlΪ¡°mine.html¡± }else { var path_tail = this.path.replace(/\//, ""); //È¥µôthis.pathÖµµÄµÚÒ»¸öб¸Ü vm.pageUrl = path_tail + ".html"; //¶¯Ì¬ÐÞ¸ÄpageUrlÊôÐÔÖµ } } |
ÕâʱºòµÄÔËÐнá¹ûÈçÏÂËùʾ£º

×Դ˱ãʵÏÖÁËÎÒÃǵÄÐèÇó¡£µ«ÊÇÕâÑù»¹²»¹»ÍêÃÀ¡ª¡ªÃ¿¸öÒ³ÃæµÄÑùʽզ´¦ÀíÄØ£¿
ÎÒÃÇ¿ÉÒÔÖ±½ÓÔÚÒ³ÃæÉÏд<style>±êÇ©£¬»òÕßÖ±½Óд¸ö<link>ÒýÈëÍⲿÑùʽÎļþ£¬µ«Ç°Õß²»ºÃά»¤£¬ºóÕ߱Ͼ¹²»ÊDzåÈëµ½headÖеIJ»Ì«¹æ·¶¡£ÄÇôÎÒÃÇÄÜ·ñÒ²ÓÃrequireJSÄ£¿é»¯¶¯Ì¬ÒýÈëÑùʽÎļþÄØ£¿´ð°¸Êǿ϶¨µÄ£¬²»¹ýµÃ½èÖúÓÚÆä×é¼þcss.js¡£
ÒÔ¡°ÕË»§ÏêÇ顱£¨detail.html£©ÎªÀý£¬ÎÒÃÇ´´½¨Ò»¸ödetail.cssÎļþ£¬ÀïÃæÉèÖà .detail{color:red;}¡£
ÏÈÈ·±£require.configÖеÄpathsÀï¼ÓÉÏÁ˸Ã×é¼þ£º
paths:{ //ÕâÀïÅäÖõĵØÖ·£¬¶¼ÊÇÏà¶ÔÓÚÉÏ·½µÄbaseUrlµÄ avalon: 'avalon', domReady:'domReady', mmHistory: 'mmHistory', mmRouter: 'mmRouter', css: 'css' //¼ÓÉÏcss.js } |
È»ºóÐÞ¸Ädetail.htmlÒ³ÃæÄÚÈÝ£º
<section ms-controller="detail" class="detail ms-controller"> Ó´Ó´Ó´£¬ÕâÀïÊÇÏêÇéÒ³Ãæ£¬{{username.name}}ÄãºÃ </section> <script> require(['avalon','css!../../css/detail.css'], function(){ //ÏÂÃæµÄÆäʵ½¨Òéд³ÉÒ»¸öÄ£¿édetail.jsÈ»ºóÓÉrequireÒýÈë avalon.define({ $id: "detail", username: conf.username }); avalon.scan(); }) </script> |
¡°css!/XXX.css¡± ÊÇcss.jsµÄд·¨£¬×¢ÒâÒÔ"css!"¿ªÍ·¼´¿É¡£
ÔËÐнá¹ûÈçÏ£º

ÒÔÉϱãÊÇavalonǰ¶Ë·Óɵļòµ¥ÊµÏÖ£¬±¾ÕµÄʾÀý´úÂë¿ÉÒÔ´ÓÕâÀïÏÂÔØ¡£
|