½éÉÜ
ʹÓùý JavaScript¿ò¼Ü£¨Èç AngularJS, Backbone »òÕßEmber£©µÄÈ˶¼ºÜÊìϤÔÚUI£¨Óû§½çÃæ£¬Ç°¶Ë£©ÖÐmvcµÄ¹¤×÷»úÀí¡£ÕâЩ¿ò¼ÜʵÏÖÁËMVC£¬Ê¹µÃÔÚÒ»¸öµ¥Ò³ÃæÖÐʵÏÖ¸ù¾ÝÐèÒª±ä»¯ÊÓͼʱ¸ü¼ÓÇáËÉ£¬¶øÄ£ÐÍ-ÊÓͼ-¿ØÖÆÆ÷£¨mvc£©µÄºËÐĸÅÄî¾ÍÊÇ£º´¦Àí´«ÈëÇëÇóµÄ¿ØÖÆÆ÷¡¢ÏÔʾÐÅÏ¢µÄÊÓͼ¡¢±íʾҵÎñ¹æÔòºÍÊý¾Ý·ÃÎʵÄÄ£ÐÍ¡£
Òò´Ë£¬µ±ÐèÒª´´½¨ÕâÑùÒ»¸öÐèÒªÔÚµ¥¸öÒ³ÃæÖÐʵÏÖÇл»³ö²»Í¬ÄÚÈݵÄÓ¦ÓÃʱ£¬ÎÒÃÇͨ³£Ñ¡ÔñʹÓÃÉÏÊö¿ò¼ÜÖ®Ò»¡£µ«ÊÇ,Èç¹ûÎÒÃǽö½öÐèÒªÒ»¸öÔÚÒ»¸öurlÖÐʵÏÖÊÓͼÇл»µÄ¿ò¼Ü,¶ø²»ÐèÒª¶îÍâÀ¦°óµÄ¹¦Äܵϰ£¬¾Í²»±ØÊ¹ÓÃÏóAngularºÍEmberµÈ¸´ÔӵĿò¼Ü¡£±¾ÎľÍÊdz¢ÊÔʹÓüòµ¥¡¢ÓÐЧ·½·¨À´½â¾öͬÑùµÄÎÊÌâ¡£
¸ÅÄî
Ó¦ÓÃÖеĴúÂëÀûÓÃurlsÖеġ°#¡±ÊµÏÖMVCģʽµÄµ¼º½¡£Ó¦ÓÃÒÔÒ»¸öȱʡµÄurl¿ªÊ¼£¬»ùÓÚ¹þÏ£ÖµµÄ´úÂë¼ÓÔØÓ¦ÓÃÊÓͼ²¢ÇÒ½«¶ÔÏó-Ä£ÐÍÓ¦ÓÃÓÚÊÓͼģ°å¡£
url¸ñʽÏñÏÂÃæÕâÑù£º
http://Domain Name/index.html#/Route Name
ÊÓͼÄÚÈݱØÐëÒÔ{{Property-Name}}µÄ·½Ê½°ó¶¨¶ÔÏóÄ£Ð͵ÄÖµºÍÊôÐÔ¡£´úÂë»á²éÕÒÕâ¸öרÃŵÄÄ£°å¸ñʽ²¢ÇÒ´úÌæ¶ÔÏóÄ£ÐÍÖеÄÊôÐÔÖµ¡£
ÒÔajaxµÄ·½Ê½Òì²½¼ÓÔØµÄÊÓͼ»á±»·ÅÖÃÓÚÒ³ÃæµÄռλ·ûÖС£ÊÓͼռλ·û¿ÉÒÔÊÇÈκεÄÔªËØ£¨ÀíÏëµÄÇé¿öÊÇdiv£©£¬µ«ÊÇËü±ØÐëÓÐÒ»¸öרÃŵÄÊôÐÔ£¬´úÂë¸ù¾ÝÕâ¸öרÃŵÄÊôÐÔÀ´¶¨Î»Ëü£¬ÕâÑùͬÑùÓÐÖúÓÚ´úÂëµÄʵÏÖ¡£µ±url¸Ä±äʱ£¬»áÖØ¸´Õâ¸ö³¡¾°£¬ÁíÍâÒ»¸öÊÓͼ±»¼ÓÔØ¡£ÌýÆðÀ´ºÜ¼òµ¥°É£¡ÏÂÃæµÄÁ÷³Ìͼ½âÊÍÁËÔÚÕâ¸öÌØ¶¨µÄʵÏÖÖеÄÏûÏ¢Ìø×ª¡£

д´úÂë
ÎÒÃÇÒÔ»ù±¾µÄÄ£¿éÉè¼ÆÄ£Ê½¿ªÊ¼£¬²¢ÇÒ×îÖÕÓÃÃÅÃæÉè¼ÆÄ£Ê½µÄ·½Ê½½«ÎÒÃǵÄlibsÆØ¹âÓÚÈ«¾Ö·¶Î§ÄÚ¡£
; (function (w, d, undefined) { //rest
of the code })(window, document);
ÎÒÃÇÐèÒª½«ÊÓÍ¼ÔªËØ´æ´¢µ½Ò»¸ö±äÁ¿ÖУ¬ÕâÑù¾Í¿ÉÒÔ¶à´ÎʹÓá£
var _viewElement = null; //element that
will be used to render the view
ÎÒÃÇÐèÒªÒ»¸öȱʡµÄ·ÓÉÀ´Ó¦¶ÔurlÖÐûÓзÓÉÐÅÏ¢µÄÇé¿ö£¬ÕâÑù¾ÍȱʡµÄÊÓͼ¾Í¿ÉÒÔ±»¼ÓÔØ¶ø²»ÊÇչʾ¿Õ°×Ò³Ãæ¡£
var _defaultRoute = null;
ÏÖÔÚÎÒÃÇÀ´´´½¨ÎÒÃǵÄÖ÷ÒªMVC¶ÔÏóµÄ¹¹Ôì·½·¨¡£ÎÒÃÇ»á°Ñ·ÓÉÐÅÏ¢´æ´¢ÔÚ¡°_routeMap¡±ÖÐ
var jsMvc = function () { //mapping object for the routes this._routeMap = {}; } |
ÊÇʱºò´´½¨Â·ÓɶÔÏóÁË£¬ÎÒÃǻὫ·ÓÉ¡¢Ä£°å¡¢¿ØÖÆÆ÷µÄÐÅÏ¢´æ´¢ÔÚÕâ¸ö¶ÔÏóÖС£
var routeObj = function (c, r, t) { this.controller = c; this.route = r; this.template = t; } |
ÿһ¸öurl»áÓÐÒ»¸öרÃŵÄ·ÓɶÔÏórouteObj.ËùÓеÄÕâЩ¶ÔÏ󶼻ᱻÌí¼Óµ½_routeMap¶ÔÏóÖУ¬ÕâÑùÎÒÃǺóÐø¾Í¿ÉÒÔͨ¹ýkey-valueµÄ·½Ê½»ñÈ¡ËüÃÇ¡£
ΪÁËÌí¼Ó·ÓÉÐÅÏ¢µ½MVC libsÖУ¬ÎÒÃÇÐè񻮯¹âlibsÖеÄÒ»¸ö·½·¨¡£ËùÒÔÈÃÎÒÃÇ´´½¨Ò»¸ö·½·¨£¬Õâ¸ö·½·¨¿ÉÒÔ±»¸÷×ԵĿØÖÆÆ÷ÓÃÀ´Ìí¼ÓзÓÉ¡£
jsMvc.prototype.AddRoute = function (controller, route, template) { this._routeMap[route] = new routeObj(controller, route, template); } |
·½·¨AddRoute½ÓÊÕ3¸ö²ÎÊý£º¿ØÖÆÆ÷£¬Â·ÓɺÍÄ£°å( contoller, route and template)¡£ËûÃÇ·Ö±ðÊÇ£º
controller:¿ØÖÆÆ÷µÄ×÷ÓþÍÊÇ·ÃÎÊÌØ¶¨µÄ·Ïß¡£
route:·ÓɵÄ·Ïß¡£Õâ¸ö¾ÍÊÇurlÖÐ#ºóÃæµÄ²¿·Ö¡£
template:ÕâÊÇÍⲿµÄhtmlÎļþ£¬Ëü×÷ΪÕâ¸ö·ÓɵÄÊÓͼ±»¼ÓÔØ¡£ÏÖÔÚÎÒÃǵÄlibsÐèÒªÒ»¸öÇÐÈëµãÀ´½âÎöurl£¬²¢ÇÒΪÏà¹ØÁªµÄhtmlÄ£°åÒ³ÃæÌṩ·þÎñ¡£ÎªÁËÍê³ÉÕâ¸ö£¬ÎÒÃÇÐèÒªÒ»¸ö·½·¨¡£
Initialize·½·¨×öÈçϵÄÊÂÇ飺
1£©»ñÈ¡ÊÓͼÏà¹ØµÄÔªËØµÄ³õʼ»¯¡£´úÂëÐèÒªÒ»¸ö¾ßÓÐviewÊôÐÔµÄÔªËØ£¬ÕâÑù¿ÉÒÔ±»ÓÃÀ´ÔÚHTMLÒ³ÃæÖвéÕÒ£º
2£©ÉèÖÃȱʡµÄ·ÓÉ
3£©ÑéÖ¤ÊÓÍ¼ÔªËØÊÇ·ñºÏÀí
4£©°ó¶¨´°¿Ú¹þÏ£±ä¸üʼþ£¬µ±url²»Í¬¹þÏ£Öµ·¢Éú±ä¸üʱÊÓͼ¿ÉÒÔ±»¼°Ê±¸üÐÂ
5£©×îºó£¬Æô¶¯mvc
//Initialize the Mvc manager object to start functioning jsMvc.prototype.Initialize = function () { var startMvcDelegate = startMvc.bind(this);
//get the html element that will be used to
render the view
_viewElement = d.querySelector('[view]');
if (!_viewElement) return; //do nothing if view
element is not found
//Set the default route
_defaultRoute = this._routeMap[Object.getOwnPropertyNames(this._routeMap)[0]];
//start the Mvc manager
w.onhashchange = startMvcDelegate;
startMvcDelegate();
} |
ÔÚÉÏÃæµÄ´úÂëÖУ¬ÎÒÃÇ´ÓstartMvc ·½·¨Öд´½¨ÁËÒ»¸ö´úÀí·½·¨startMvcDelegate ¡£µ±¹þÏ£Öµ±ä»¯Ê±£¬Õâ¸ö´úÀí¶¼»á±»µ÷Óá£ÏÂÃæ¾ÍÊǵ±¹þÏ£Öµ±ä»¯Ê±ÎÒÃÇ×öµÄ²Ù×÷µÄÏȺó˳Ðò£º
1£©»ñÈ¡¹þÏ£Öµ
2£©´Ó¹þÏ£Öлñȡ·ÓÉÖµ
3£©´Ó·ÓÉmap¶ÔÏó_routeMapÖлñȡ·ÓɶÔÏórouteObj
4£©Èç¹ûurlÖÐûÓзÓÉÐÅÏ¢£¬ÐèÒª»ñȡȱʡµÄ·ÓɶÔÏó
5£©×îºó£¬µ÷ÓøúÕâ¸ö·ÓÉÓйصĿØÖÆÆ÷²¢ÇÒΪÕâ¸öÊÓÍ¼ÔªËØµÄÊÓͼÌṩ·þÎñ
ÉÏÃæµÄËùÓв½Öè¶¼±»ÏÂÃæµÄstartMvc·½·¨ËùʵÏÖ
//function to start the mvc support function startMvc() { var pageHash = w.location.hash.replace('#', ''), routeName = null, routeObj = null;
routeName = pageHash.replace('/', ''); //get
the name of the route from the hash
routeObj = this._routeMap[routeName]; //get the
route object
//Set to default route object if no route found
if (!routeObj)
routeObj = _defaultRoute;
loadTemplate(routeObj, _viewElement, pageHash);
//fetch and set the view of the route
} |
ÏÂÒ»²½£¬ÎÒÃÇÐèҪʹÓÃXML HTTPÇëÇóÒì²½¼ÓÔØºÏÊʵÄÊÓͼ¡£Îª´Ë£¬ÎÒÃǻᴫµÝ·ÓɶÔÏóµÄÖµºÍÊÓÍ¼ÔªËØ¸ø·½·¨loadTemplate¡£
//Function to load external html data function loadTemplate(routeObject, view) { var xmlhttp; if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); } xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { loadView(routeObject, view, xmlhttp.responseText); } } xmlhttp.open('GET', routeObject.template, true); xmlhttp.send(); } |
µ±Ç°Ö»Ê£¼ÓÔØÊÓͼºÍ½«¶ÔÏóÄ£ÐÍÓëÊÓͼģ°å°ó¶¨ÁË¡£ÎÒÃǻᴴ½¨Ò»¸ö¿ÕµÄÄ£ÐͶÔÏó£¬È»ºó´«µÝÓë·½·¨Ïà¹ØµÄÄ£ÐÍÀ´»½ÐÑ·ÓÉ¿ØÖÆÆ÷¡£¸üкóµÄÄ£ÐͶÔÏó»áÓëÏÈǰÒѾ¼ÓÔØµÄXHRµ÷ÓÃÖеÄHTMLÄ£°å°ó¶¨¡£
loadView ·½·¨±»ÓÃÓÚµ÷ÓÿØÖÆÆ÷·½·¨£¬ÒÔ¼°×¼±¸Ä£ÐͶÔÏó¡£
replaceToken·½·¨±»ÓÃÓÚÓëHTMLÄ£°åÒ»Æð°ó¶¨Ä£ÐÍ
//Function to load the view with the template function loadView(routeObject, viewElement, viewHtml) { var model = {};
//get the resultant model from the controller
of the current route
routeObject.controller(model);
//bind the model with the view
viewHtml = replaceToken(viewHtml, model);
//load the view into the view element
viewElement.innerHTML = viewHtml;
}
function replaceToken(viewHtml, model) {
var modelProps = Object.getOwnPropertyNames(model),
modelProps.forEach(function (element, index,
array) {
viewHtml = viewHtml.replace('{{' + element + '}}',
model[element]);
});
return viewHtml;
} |
×îºó£¬ÎÒÃǽ«²å¼þÆØ¹âÓÚjsÈ«¾Ö·¶Î§Íâ
//attach the mvc object to the window w['jsMvc'] = new jsMvc(); |
ÏÖÔÚ£¬ÊÇʱºòÔÚÎÒÃǵ¥Ò³Ó¦ÓÃÖÐʹÓÃÕâ¸öMVC²å¼þ¡£ÔÚÏÂÒ»¸ö´úÂë¶ÎÖУ¬ÏÂÃæÕâЩ»áʵÏÖ:
1)ÔÚwebÒ³ÃæÖÐÒýÈëÕâ¸ö´úÂë
2£©ÓÿØÖÆÆ÷Ìí¼Ó·ÓÉÐÅÏ¢ºÍÊÓͼģ°åÐÅÏ¢
3£©´´½¨¿ØÖÆÆ÷¹¦ÄÜ
4£©×îºó£¬³õʼ»¯lib¡£
³ýÁËÉÏÃæÎÒÃÇÐèÒªµÄÁ´½ÓÈÃÎÒÃǵ¼º½µ½²»Í¬µÄ·¾¶Í⣬һ¸öÈÝÆ÷ÔªËØµÄÊÓͼÊôÐÔ°üº¬×ÅÊÓͼģ°åhtml¡£
<!DOCTYPE html> <html> <head> <title>JavaScript Mvc</title> <script src="jsMvc.js"></script> <!--[if lt IE 9]> <script src="jsMvc-ie8.js"></script> <![endif]-->
<style type="text/css">
.NavLinkContainer {
padding: 5px;
background-color: lightyellow;
}
.NavLink {
background-color:black;
color: white;
font-weight:800;
text-decoration:none;
padding:5px;
border-radius:4px;
}
.NavLink:hover {
background-color:gray;
}
</style>
</head>
<body>
<h3>Navigation Links</h3>
<div class="NavLinkContainer">
<a class="NavLink" href="index.html#/home">Home</a>
<a class="NavLink" href="index.html#/contact">Contact</a>
<a class="NavLink" href="index.html#/admin">Admin</a>
</div>
<br />
<br />
<h3>View</h3>
<div view></div>
<script>
jsMvc.AddRoute(HomeController, 'home', 'Views/home.html');
jsMvc.AddRoute(ContactController, 'contact', 'Views/contact.html');
jsMvc.AddRoute(AdminController, 'admin', 'Views/admin.html');
jsMvc.Initialize();
function HomeController(model) {
model.Message = 'Hello World';
}
function ContactController(model) {
model.FirstName = "John";
model.LastName = "Doe";
model.Phone = '555-123456';
}
function AdminController(model) {
model.UserName = "John";
model.Password = "MyPassword";
}
</script>
</body>
</html> |
ÉÏÃæµÄ´úÂëÓÐÒ»¶Î°üº¬Ò»¸öΪIEµÄÌõ¼þ×¢ÊÍ¡£
<!--[if lt IE 9]> <script src="jsMvc-ie8.js"></script> <![endif]--> |
Èç¹ûIEµÄ°æ±¾µÍÓÚ9£¬ÄÇôfunction.bind£¬Object.getOwnPropertyNamesºÍArray.forEachÊôÐÔ½«²»»á±»Ö§³Ö¡£Òò´ËÎÒÃÇҪͨ¹ýÅжÏä¯ÀÀÆ÷ÊÇ·ñµÍÓÚIE9À´·´À¡´úÂëÊÇ·ñÖ§³Ö¡£
ÆäÖеÄÄÚÈÝÓÐhome.html£¬ contact.html ºÍ admin.html Çë¿´ÏÂÃæ£º
home.html:

contact.html:
{{FirstName}} {{LastName}} <br /> {{Phone}} |

admin.html:
<div style="padding:2px;margin:2px;text-align:left;"> <label for="txtUserName">User Name</label> <input type="text" id="txtUserName" value="{{UserName}}" /> </div> <div style="padding:2px;margin:2px;text-align:left;"> <label for="txtPassword">Password</label> <input type="password" id="txtPassword" value="{{Password}}" /> </div> |

ÍêÕûµÄ´úÂë¿ÉÒÔ´Ó¸ø¶¨µÄÏÂÔØÁ´½ÓÖеõ½¡£
ÈçºÎÔËÐдúÂë
ÔËÐиôúÂë±È½Ï¼òµ¥£¬ÐèÒªÔÚÄãϲ»¶µÄWeb·þÎñÆ÷ÉÏ´´½¨Ò»¸öWebÓ¦Óã¬ÏÂÃæÒÔIISΪÀýÀ´ËµÃ÷¡£
Ê×ÏÈÔÚĬÈÏÕ¾µãÖÐÐÂÔöÒ»¸öWebÓ¦ÓÃ.

È»ºóÉèÖñØÌîÐÅÏ¢£º±ðÃû£¬ÎïÀí·¾¶£¬Ó¦Óóأ¬Óû§ÈÏÖ¤ÐÅÏ¢£¬µã»÷OK¡£

×îºó¶¨Î»µ½WebÓ¦ÓõÄÄÚÈÝĿ¼£¬ä¯ÀÀÄãÏë´ò¿ªµÄHTMLÒ³Ãæ¼´¿É¡£

ÅÜÔÚ·þÎñÆ÷ÀïÊDZØÒªµÄ£¬ÒòΪ´úÂë¼ÓÔØ´Ó´æ´¢ÓÚÍⲿÎļþÖеÄÊÓͼ£¬ä¯ÀÀÆ÷²»»áÔÊÐíÎÒÃǵĴúÂëÔÚ·ÇËÞÖ÷·þÎñÆ÷»·¾³ÏÂÖ´ÐС£µ±È»Èç¹ûÄãʹÓÃVisual
StudioÄÇôֱ½ÓÔÚÄ¿±êhtmlÎļþÉÏÓÒ¼ü£¬Ñ¡Ôñ¡®View In Browser¡¯¼´¿É¡£
ä¯ÀÀÆ÷Ö§³Ö
´ó²¿·ÖµÄÏÖ´úä¯ÀÀÆ÷¶¼Ö§³Ö±¾´úÂë¡£Õë¶ÔIE8¼°ÒÔϵÄä¯ÀÀÆ÷£¬ÓÐÒ»·Ýµ¥¶ÀµÄ´úÂëÀ´Ö§³Ö£¬µ«ºÜ²»ÐÒ£¬Õâ·Ý´úÂëÔ¶¶àÓÚ100ÐС£Òò´ËÕâ´úÂë²»Êǰٷְٿçä¯ÀÀÆ÷¼æÈݵģ¬ËùÒÔµ±Äã¾ö¶¨ÔÚÏîÄ¿ÖÐʹÓÃʱÐèÒª¶Ô´úÂë½øÐÐ΢µ÷¡£
ÐËȤµã
This example demonstratesÕâ¸öʾÀýÏòÎÒÃÇչʾÁ˶ÔÓڷdz£Ã÷È·µØÐèÇóÀ´Ëµ£¬ÕæÃ»±ØÒªÈ«²¿Ê¹ÓÃjs¿âºÍ¿ò¼ÜÀ´ÊµÏÖ¡£WebÓ¦ÓÃÊÇ×ÊÔ´Ãܼ¯Ð͵ģ¬×îºÃֻʹÓñØÒªµÄ´úÂë¶ø¶ªµôÆäËû¶àÓಿ·Ö¡£
ĿǰµÄ´úÂëÄÜ×öµÄ¾ÍÕâЩÁË¡£Ã»ÓÐÖîÈçWeb·þÎñµ÷Ó㬶¯Ì¬Ê¼þ°ó¶¨¹¦Äܵġ£ºÜ¿ìÎÒ»áÌṩ֧³Ö¸ü¶àÌØÐÔµÄÉý¼¶°æ±¾¡£ |