¼ò½é
AngularJSÊÇĿǰ×îΪ»îÔ¾µÄJavascript¿ò¼ÜÖ®Ò»£¬AngularJSµÄÄ¿±êÖ®Ò»ÊǼò»¯¿ª·¢¹ý³Ì£¬ÕâʹµÃAngularJS·Ç³£ÉÆÓÚ¹¹½¨Ð¡ÐÍappÔÐÍ£¬µ«AngularJS¶ÔÓÚÈ«¹¦ÄܵĿͻ§¶ËÓ¦ÓóÌÐòͬÑùÇ¿´ó£¬Ëü½áºÏÁË¿ª·¢¼ò±ã£¬ÌØÐԹ㷺ºÍ³öÖÚµÄÐÔÄÜ£¬Ê¹Æä±»¹ã·ºÊ¹Óá£È»¶ø£¬´óÁ¿Ê¹ÓÃÒ²»á²úÉúÖî¶àÎóÇø¡£ÒÔÏÂÕâ·ÝÁбíժȡÁ˳£¼ûµÄһЩAngularJSµÄ´íÎóÓ÷¨£¬ÓÈÆäÊÇÔÚapp¿ª·¢¹ý³ÌÖС£
1. MVCĿ¼½á¹¹
AngularJS£¬Ö±°×µØËµ£¬¾ÍÊÇÒ»¸öMVC¿ò¼Ü¡£ËüµÄÄ£ÐͲ¢Ã»ÓÐÏñbackbone.js¿ò¼ÜÄÇÑù¶¨ÒåµÄÈç´ËÃ÷È·£¬µ«ËüµÄÌåϵ½á¹¹È´Ç¡ÈçÆä·Ö¡£µ±Ä㹤×÷ÓÚÒ»¸öMVC¿ò¼Üʱ£¬ÆÕ±éµÄ×ö·¨ÊǸù¾ÝÎļþÀàÐÍ¶ÔÆä½øÐйéÀࣺ
templates/ _login.html _feed.html app/ app.js controllers/ LoginController.js FeedController.js directives/ FeedEntryDirective.js services/ LoginService.js FeedService.js filters/ CapatalizeFilter.js |
¿´ÆðÀ´£¬ÕâËÆºõÊÇÒ»¸öÏÔ¶øÒ×¼ûµÄ½á¹¹£¬¸üºÎ¿öRailsÒ²ÊÇÕâô¸ÉµÄ¡£È»¶øÒ»µ©app¹æÄ£¿ªÊ¼À©ÕÅ£¬ÕâÖֽṹ»áµ¼ÖÂÄãÒ»´ÎÐèÒª´ò¿ªºÜ¶àĿ¼£¬ÎÞÂÛÄãÊÇʹÓÃsublime£¬Visual
Studio»òÊÇVim½áºÏNerd Tree£¬Äã¶¼»áͶÈëºÜ¶àʱ¼äÔÚĿ¼Ê÷Öв»¶ÏµØ»¬ÉÏ»¬Ï¡£
Óë°´ÕÕÀàÐÍ»®·ÖÎļþ²»Í¬£¬È¡¶ø´úÖ®µÄ£¬ÎÒÃÇ¿ÉÒÔ°´ÕÕÌØÐÔ»®·ÖÎļþ£º
app/ app.js Feed/ _feed.html FeedController.js FeedEntryDirective.js FeedService.js Login/ _login.html LoginController.js LoginService.js Shared/ CapatalizeFilter.js |
ÕâÖÖĿ¼½á¹¹Ê¹µÃÎÒÃÇÄܹ»¸üÈÝÒ×µØÕÒµ½Óëij¸öÌØÐÔÏà¹ØµÄËùÓÐÎļþ£¬¼Ì¶ø¼Ó¿ìÎÒÃǵĿª·¢½ø¶È¡£¾¡¹Ü½«.htmlºÍ.jsÎļþÖÃÓÚÒ»´¦¿ÉÄÜ´æÔÚÕùÒ飬µ«½ÚÊ¡ÏÂÀ´µÄʱ¼ä¸üÓмÛÖµ¡£
2. Ä£¿é
½«ËùÓж«Î÷¶¼Ò»¹ÉÄÔ·ÅÔÚÖ÷Ä£¿éÏÂÊǺܳ£¼ûµÄ£¬¶ÔÓÚСÐÍapp£¬¸Õ¿ªÊ¼²¢Ã»ÓÐʲôÎÊÌ⣬Ȼ¶øºÜ¿ìÄã¾Í»á·¢ÏÖ¿ÓµùµÄÊÂÀ´ÁË¡£
var app = angular.module('app',[]); app.service('MyService', function(){ //service code }); app.controller('MyCtrl', function($scope, MyService){ //controller code }); |
ÔÚ´ËÖ®ºó£¬Ò»¸ö³£¼ûµÄ²ßÂÔÊǶÔÏàͬÀàÐ͵ĶÔÏó¹éÀà¡£
var services = angular.module('services',[]); services.service('MyService', function(){ //service code }); var controllers = angular.module('controllers',['services']); controllers.controller('MyCtrl', function($scope, MyService){ //controller code }); var app = angular.module('app',['controllers', 'services']); |
ÕâÖÖ·½Ê½ºÍÇ°ÃæµÚÒ»²¿·ÖËù̸µ½µÄĿ¼½á¹¹²î²»¶à£º²»¹»ºÃ¡£¸ù¾ÝÏàͬµÄÀíÄ¿ÉÒÔ°´ÕÕÌØÐÔ¹éÀ࣬Õâ»á´øÀ´¿ÉÀ©Õ¹ÐÔ¡£
var sharedServicesModule = angular.module('sharedServices',[]); sharedServices.service('NetworkService', function($http){}); var loginModule = angular.module('login',['sharedServices']); loginModule.service('loginService', function(NetworkService){}); loginModule.controller('loginCtrl', function($scope, loginService){}); var app = angular.module('app', ['sharedServices', 'login']); |
µ±ÎÒÃÇ¿ª·¢Ò»¸ö´óÐÍÓ¦ÓóÌÐòʱ£¬¿ÉÄܲ¢²»ÊÇËùÓж«Î÷¶¼°üº¬ÔÚÒ»¸öÒ³ÃæÉÏ¡£½«Í¬Ò»ÀàÌØÐÔÖÃÓÚÒ»¸öÄ£¿éÄÚ£¬ÄÜʹ¿çapp¼äÖØÓÃÄ£¿é±äµÃ¸üÈÝÒס£
3. ÒÀÀµ×¢Èë
ÒÀÀµ×¢ÈëÊÇAngularJS×îºÃµÄģʽ֮һ£¬ËüʹµÃ²âÊÔ¸üΪ¼òµ¥£¬²¢ÇÒÒÀÀµÈκÎÖ¸¶¨¶ÔÏ󶼺ÜÃ÷È·¡£AngularJSµÄ×¢È뷽ʽ·Ç³£Áé»î£¬×î¼òµ¥µÄ·½Ê½Ö»ÐèÒª½«ÒÀÀµµÄÃû×Ö´«ÈëÄ£¿éµÄfunctionÖм´¿É£º
var app = angular.module('app',[]); app.controller('MainCtrl', function($scope, $timeout){ $timeout(function(){ console.log($scope); }, 1000); }); |
ÕâÀºÜÃ÷ÏÔ£¬MainCtrlÒÀÀµ$scopeºÍ$timeout¡£
Ö±µ½Äã×¼±¸½«Æä²¿Êðµ½Éú²ú»·¾³²¢Ï£Íû¾«¼ò´úÂëʱ£¬Ò»Çж¼ºÜÃÀºÃ¡£Èç¹ûʹÓÃUglifyJS£¬Ö®Ç°µÄÀý×Ó»á±ä³ÉÏÂÃæÕâÑù£º
var app=angular.module("app",[]); app.controller("MainCtrl",function(e,t){t(function(){console.log(e)},1e3)})
|
ÏÖÔÚAngularJSÔõô֪µÀMainCtrlÒÀÀµË£¿AngularJSÌṩÁËÒ»Öַdz£¼òµ¥µÄ½â¾ö·½·¨£¬¼´½«ÒÀÀµ×÷Ϊһ¸öÊý×é´«È룬Êý×éµÄ×îºóÒ»¸öÔªËØÊÇÒ»¸öº¯Êý£¬ËùÓеÄÒÀÀµÏî×÷ΪËüµÄ²ÎÊý¡£
app.controller('MainCtrl', ['$scope', '$timeout', function($scope, $timeout){ $timeout(function(){ console.log($scope); }, 1000); }]); |
ÕâÑù×öÄܹ»¾«¼ò´úÂ룬²¢ÇÒAngularJSÖªµÀÈçºÎ½âÊÍÕâЩÃ÷È·µÄÒÀÀµ£º
app.controller("MainCtrl",["$scope","$timeout",function(e,t) {t(function(){console.log(e)},1e3)}])
|
3.1 È«¾ÖÒÀÀµ
ÔÚ±àдAngularJS³ÌÐòʱ£¬Ê±³£»á³öÏÖÕâÖÖÇé¿ö£ºÄ³¸ö¶ÔÏóÓÐÒ»¸öÒÀÀµ£¬¶øÕâ¸ö¶ÔÏóÓÖ½«Æä×ÔÉí°ó¶¨ÔÚÈ«¾ÖscopeÉÏ£¬ÕâÒâζ×ÅÔÚÈκÎAngularJS´úÂëÖÐÕâ¸öÒÀÀµ¶¼ÊÇ¿ÉÓõ쬵«ÕâÈ´ÆÆ»µÁËÒÀÀµ×¢ÈëÄ£ÐÍ£¬²¢»áµ¼ÖÂһЩÎÊÌ⣬ÓÈÆäÌåÏÖÔÚ²âÊÔ¹ý³ÌÖС£
ʹÓÃAngularJS¿ÉÒÔºÜÈÝÒ׵Ľ«ÕâЩȫ¾ÖÒÀÀµ·â×°½øÄ£¿éÖУ¬ËùÒÔËüÃÇ¿ÉÒÔÏñAngularJS±ê׼ģ¿éÄÇÑù±»×¢Èë½øÈ¥¡£
Underscrore.jsÊÇÒ»¸öºÜÔ޵Ŀ⣬Ëü¿ÉÒÔÒÔº¯ÊýʽµÄ·ç¸ñ¼ò»¯Javascript´úÂ룬ͨ¹ýÒÔÏ·½Ê½£¬Äã¿ÉÒÔ½«Æäת»¯ÎªÒ»¸öÄ£¿é£º
var underscore = angular.module('underscore', []); underscore.factory('_', function() { return window._; //Underscore must already be loaded on the page }); var app = angular.module('app', ['underscore']); app.controller('MainCtrl', ['$scope', '_', function($scope, _) { init = function() { _.keys($scope); } init(); }]); |
ÕâÑùµÄ×ö·¨ÔÊÐíÓ¦ÓóÌÐò¼ÌÐøÒÔAngularJSÒÀÀµ×¢ÈëµÄ·ç¸ñ½øÐпª·¢£¬Í¬Ê±ÔÚ²âÊÔ½×¶ÎÒ²Äܽ«underscore½»»»³öÈ¥¡£
Õâ¿ÉÄÜ¿´ÉÏȥʮ·ÖËöË飬ûʲô±ØÒª£¬µ«Èç¹ûÄãµÄ´úÂëÖÐÕýÔÚʹÓÃuse strict£¨¶øÇÒ±ØÐëʹÓã©£¬ÄÇÕâ¾ÍÊDZØÒªµÄÁË¡£
4. ¿ØÖÆÆ÷ÅòÕÍ
¿ØÖÆÆ÷ÊÇAngularJSµÄÈâºÍÍÁ¶¹£¬Ò»²»Ð¡ÐľͻὫ¹ý¶àµÄÂß¼¼ÓÈëÆäÖУ¬ÓÈÆäÊǸտªÊ¼µÄʱºò¡£¿ØÖÆÆ÷ÓÀÔ¶¶¼²»Ó¦¸ÃÈ¥²Ù×÷DOM£¬»òÊdzÖÓÐDOMÑ¡ÔñÆ÷£¬ÄÇÊÇÎÒÃÇÐèҪʹÓÃÖ¸ÁîºÍng-modelµÄµØ·½¡£Í¬ÑùµÄ£¬ÒµÎñÂß¼Ó¦¸Ã´æÔÚÓÚ·þÎñÖУ¬¶ø·Ç¿ØÖÆÆ÷¡£
Êý¾ÝÒ²Ó¦¸Ã´æ´¢ÔÚ·þÎñÖУ¬³ý·ÇËüÃÇÒѾ±»°ó¶¨ÔÚ$scopeÉÏÁË¡£·þÎñ±¾ÉíÊǵ¥ÀýµÄ£¬ÔÚÓ¦ÓóÌÐòµÄÕû¸öÉúÃüÖÜÆÚ¶¼´æÔÚ£¬È»¶ø¿ØÖÆÆ÷ÔÚÓ¦ÓóÌÐòµÄ¸÷״̬¼äÊÇ˲̬µÄ¡£Èç¹ûÊý¾Ý±»±£´æÔÚ¿ØÖÆÆ÷ÖУ¬µ±Ëü±»ÔÙ´ÎʵÀý»¯Ê±¾ÍÐèÒªÖØÐ´Óij´¦»ñÈ¡Êý¾Ý¡£¼´Ê¹½«Êý¾Ý´æ´¢ÓÚlocalStorageÖУ¬¼ìË÷µÄËÙ¶ÈÒ²Òª±ÈJavascript±äÁ¿ÂýÒ»¸öÊýÁ¿¼¶¡£
AngularJSÔÚ×ñѵ¥Ò»Ö°ÔðÔÔò£¨SRP£©Ê±ÔËÐÐÁ¼ºÃ£¬Èç¹û¿ØÖÆÆ÷ÊÇÊÓͼºÍÄ£ÐͼäµÄе÷Õߣ¬ÄÇôËüËù°üº¬µÄÂß¼¾ÍÓ¦¸Ã¾¡Á¿ÉÙ£¬ÕâͬÑù»á¸ø²âÊÔ´øÀ´±ãÀû¡£
5. Service vs Factory
¼¸ºõÿһ¸öAngularJS¿ª·¢ÈËÔ±ÔÚ³õѧʱ¶¼»á±»ÕâЩÃû´ÊËùÀ§ÈÅ£¬ÕâÕæµÄ²»Ì«Ó¦¸Ã£¬ÒòΪËüÃǾÍÊÇÕë¶Ô¼¸ºõÏàͬÊÂÎïµÄÓï·¨ÌǶøÒÑ£¡
ÒÔÏÂÊÇËüÃÇÔÚAngularJSÔ´´úÂëÖе͍Ò壺
function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); } function service(name, constructor) { return factory(name, ['$injector', function($injector) { return $injector.instantiate(constructor); }]); } |
´ÓÔ´´úÂëÖÐÄã¿ÉÒÔ¿´µ½£¬service½ö½öÊǵ÷ÓÃÁËfactoryº¯Êý£¬¶øºóÕßÓÖµ÷ÓÃÁËproviderº¯Êý¡£ÊÂʵÉÏ£¬AngularJSҲΪһЩֵ¡¢³£Á¿ºÍ×°ÊÎÌṩ¶îÍâµÄprovider·â×°£¬¶øÕâЩ²¢Ã»Óе¼ÖÂÀàËÆµÄÀ§»ó£¬ËüÃǵÄÎĵµ¶¼·Ç³£ÇåÎú¡£
ÓÉÓÚservice½ö½öÊǵ÷ÓÃÁËfactoryº¯Êý£¬ÕâÓÐÊ²Ã´Çø±ðÄØ£¿ÏßË÷ÔÚ$injector.instantiate£ºÔÚÕâ¸öº¯ÊýÖУ¬$injectorÔÚserviceµÄ¹¹Ô캯ÊýÖд´½¨ÁËÒ»¸öеÄʵÀý¡£
ÒÔÏÂÊÇÒ»¸öÀý×Ó£¬Õ¹Ê¾ÁËÒ»¸öserviceºÍÒ»¸öfactoryÈçºÎÍê³ÉÏàͬµÄÊÂÇ飺
var app = angular.module('app',[]); app.service('helloWorldService', function(){ this.hello = function() { return "Hello World"; }; }); app.factory('helloWorldFactory', function(){ return { hello: function() { return "Hello World"; } } }); |
µ±helloWorldService»òhelloWorldFactory±»×¢Èëµ½¿ØÖÆÆ÷ÖУ¬ËüÃǶ¼ÓÐÒ»¸öhello·½·¨£¬·µ»Ø¡±hello
world¡±¡£serviceµÄ¹¹Ô캯ÊýÔÚÉùÃ÷ʱ±»ÊµÀý»¯ÁËÒ»´Î£¬Í¬Ê±factory¶ÔÏóÔÚÿһ´Î±»×¢Èëʱ´«µÝ£¬µ«ÊÇÈÔȻֻÓÐÒ»¸öfactoryʵÀý¡£ËùÓеÄproviders¶¼Êǵ¥Àý¡£
¼ÈÈ»ÄÜ×öÏàͬµÄÊ£¬ÎªÊ²Ã´ÐèÒªÁ½ÖÖ²»Í¬µÄ·ç¸ñÄØ£¿Ïà¶ÔÓÚservice£¬factoryÌṩÁ˸ü¶àµÄÁé»îÐÔ£¬ÒòΪËü¿ÉÒÔ·µ»Øº¯Êý£¬ÕâЩº¯ÊýÖ®ºó¿ÉÒÔ±»Ð½¨³öÀ´¡£ÕâÓºÏÁËÃæÏò¶ÔÏó±à³ÌÖй¤³§Ä£Ê½µÄ¸ÅÄ¹¤³§¿ÉÒÔÊÇÒ»¸öÄܹ»´´½¨ÆäËû¶ÔÏóµÄ¶ÔÏó¡£
app.factory('helloFactory', function() { return function(name) { this.name = name; this.hello = function() { return "Hello " + this.name; }; }; }); |
ÕâÀïÊÇÒ»¸ö¿ØÖÆÆ÷ʾÀý£¬Ê¹ÓÃÁËserviceºÍÁ½¸öfactory£¬helloFactory·µ»ØÁËÒ»¸öº¯Êý£¬µ±Ð½¨¶ÔÏóʱ»áÉèÖÃnameµÄÖµ¡£
app.controller('helloCtrl', function ($scope, helloWorldService, helloWorldFactory, helloFactory) { init = function() { helloWorldService.hello(); //'Hello World' helloWorldFactory.hello(); //'Hello World' new helloFactory('Readers').hello() //'Hello Readers' } init(); }); |
ÔÚ³õѧʱ£¬×îºÃֻʹÓÃservice¡£
FactoryÔÚÉè¼ÆÒ»¸ö°üº¬ºÜ¶à˽Óз½·¨µÄÀàʱҲºÜÓÐÓãº
app.factory('privateFactory', function(){ var privateFunc = function(name) { return name.split("").reverse().join(""); //reverses the name }; return { hello: function(name){ return "Hello " + privateFunc(name); } }; }); |
ͨ¹ýÕâ¸öÀý×Ó£¬ÎÒÃÇ¿ÉÒÔÈÃprivateFactoryµÄ¹«ÓÐAPIÎÞ·¨·ÃÎʵ½privateFunc·½·¨£¬ÕâÖÖģʽÔÚserviceÖÐÊÇ¿ÉÒÔ×öµ½µÄ£¬µ«ÔÚfactoryÖиüÈÝÒס£
6. ûÓÐʹÓÃBatarang
BatarangÊÇÒ»¸ö³öÉ«µÄChrome²å¼þ£¬ÓÃÀ´¿ª·¢ºÍ²âÊÔAngularJS app¡£
BatarangÌṩÁËä¯ÀÀÄ£Ð͵ÄÄÜÁ¦£¬ÕâʹµÃÎÒÃÇÓÐÄÜÁ¦¹Û²ìAngularJSÄÚ²¿ÊÇÈçºÎÈ·¶¨°ó¶¨µ½×÷ÓÃÓòÉϵÄÄ£Ð͵ģ¬ÕâÔÚ´¦ÀíÖ¸ÁîÒÔ¼°¸ôÀëÒ»¶¨·¶Î§¹Û²ì°ó¶¨ÖµÊ±·Ç³£ÓÐÓá£
BatarangÒ²ÌṩÁËÒ»¸öÒÀÀµÍ¼£¬ Èç¹ûÎÒÃÇÕýÔÚ½Ó´¥Ò»¸öδ¾²âÊԵĴúÂë¿â£¬Õâ¸öÒÀÀµÍ¼¾ÍºÜÓÐÓã¬ËüÄܾö¶¨ÄÄЩ·þÎñÓ¦¸Ã±»ÖØµã¹ØÕÕ¡£
×îºó£¬BatarangÌṩÁËÐÔÄÜ·ÖÎö¡£AngularÄÜ×öµ½¿ª°ü¼´Óã¬ÐÔÄÜÁ¼ºÃ£¬È»¶ø¶ÔÓÚÒ»¸ö³äÂúÁË×Ô¶¨ÒåÖ¸ÁîºÍ¸´ÔÓÂß¼µÄÓ¦ÓöøÑÔ£¬ÓÐʱºò¾Í²»ÄÇôÁ÷³©ÁË¡£Ê¹ÓÃBatarangÐÔÄܹ¤¾ß£¬Äܹ»Ö±½Ó¹Û²ìµ½ÔÚÒ»¸ödigestÖÜÆÚÖÐÄĸöº¯ÊýÔËÐÐÁË×ʱ¼ä¡£ÐÔÄܹ¤¾ßÒ²ÄÜչʾһ¿ÃÍêÕûµÄwatchÊ÷£¬ÔÚÎÒÃÇÓµÓкܶàwatcherʱ£¬ÕâºÜÓÐÓá£
7. ¹ý¶àµÄwatcher
ÔÚÉÏÒ»µãÖÐÎÒÃÇÌáµ½£¬AngularJSÄÜ×öµ½¿ª°ü¼´Óã¬ÐÔÄÜÁ¼ºÃ¡£ÓÉÓÚÐèÒªÔÚÒ»¸ödigestÖÜÆÚÖÐÍê³ÉÔàÊý¾Ý¼ì²é£¬Ò»µ©watcherµÄÊýÁ¿Ôö³¤µ½´óÔ¼2000ʱ£¬Õâ¸öÖÜÆÚ¾Í»á²úÉúÏÔÖøµÄÐÔÄÜÎÊÌâ¡££¨2000Õâ¸öÊý×Ö²»ÄÜ˵һ¶¨»áÔì³ÉÐÔÄÜ´ó·ùϽµ£¬µ«ÕâÊÇÒ»¸ö²»´íµÄ¾ÑéÊýÖµ¡£ÔÚAngularJS
1.3 release°æ±¾ÖУ¬ÒѾÓÐһЩÔÊÐíÑϸñ¿ØÖÆdigestÖÜÆÚµÄ¸Ä¶¯ÁË£¬Aaron GrayÓÐһƪºÜºÃµÄÎÄÕ¶Դ˽øÐнâÊÍ¡££©
ÒÔÏÂÕâ¸ö¡°Á¢¼´Ö´Ðеĺ¯Êý±í´ïʽ(IIFE)¡±»á´òÓ¡³öµ±Ç°Ò³ÃæÉÏËùÓеÄwatcherµÄ¸öÊý£¬Äã¿ÉÒÔ¼òµ¥µÄ½«ÆäÕ³Ìùµ½¿ØÖÆÌ¨ÖУ¬¹Û²ì½á¹û¡£Õâ¶ÎIIFEÀ´Ô´ÓÚJaredÔÚStackOverflowÉϵĻشð£º
(function () { var root = $(document.getElementsByTagName('body')); var watchers = []; var f = function (element) { if (element.data().hasOwnProperty('$scope')) { angular.forEach(element.data().$scope.$$watchers, function (watcher) { watchers.push(watcher); }); } angular.forEach(element.children(), function (childElement) { f($(childElement)); }); }; f(root); console.log(watchers.length); })(); |
ͨ¹ýÕâ¸ö·½Ê½µÃµ½watcherµÄÊýÁ¿£¬½áºÏBatarangÐÔÄܰå¿éÖеÄwatchÊ÷£¬Ó¦¸Ã¿ÉÒÔ¿´µ½ÄÄÀï´æÔÚÖØ¸´´úÂ룬»ò×ÅÄÄÀï´æÔÚ²»±äÊý¾ÝͬʱӵÓÐwatch¡£
µ±´æÔÚ²»±äÊý¾Ý£¬¶øÄãÓÖÏëÓÃAngularJS½«ÆäÄ£°æ»¯£¬¿ÉÒÔ¿¼ÂÇʹÓÃbindonce¡£BindonceÊÇÒ»¸ö¼òµ¥µÄÖ¸ÁÔÊÐíÄãʹÓÃAngularJSÖеÄÄ£°æ£¬µ«Ëü²¢²»»á¼ÓÈëwatch£¬Õâ¾Í±£Ö¤ÁËwatchÊýÁ¿²»»áÔö³¤¡£
8. ÏÞ¶¨$scopeµÄ·¶Î§
Javascript»ùÓÚÔÐ͵ļ̳ÐÓëÃæÏò¶ÔÏóÖлùÓÚÀàµÄ¼Ì³ÐÓÐ×Å΢ÃîµÄÇø±ð£¬Õâͨ³£²»ÊÇʲôÎÊÌ⣬µ«Õâ¸ö΢ÃîÖ®´¦ÔÚʹÓÃ$scopeʱ¾Í»á±íÏÖ³öÀ´¡£ÔÚAngularJSÖУ¬Ã¿¸ö$scope¶¼»á¼Ì³Ð¸¸$scope£¬×î¸ß²ã³ÆÖ®Îª$rootScope¡££¨$scopeÓ봫ͳָÁîÓÐЩ²»Í¬£¬ËüÃÇÓÐÒ»¶¨µÄ×÷Ó÷¶Î§i£¬ÇÒÖ»¼Ì³ÐÏÔʽÉùÃ÷µÄÊôÐÔ¡££©
ÓÉÓÚÔÐͼ̳еÄÌØµã£¬ÔÚ¸¸ÀàºÍ×ÓÀà¼ä¹²ÏíÊý¾Ý²»Ì«ÖØÒª£¬²»¹ýÈç¹û²»Ð¡Ðĵϰ£¬Ò²ºÜÈÝÒ×ÎóÓÃÁËÒ»¸ö¸¸$scopeµÄÊôÐÔ¡£
±ÈÈç˵£¬ÎÒÃÇÐèÒªÔÚÒ»¸öµ¼º½À¸ÉÏÏÔʾһ¸öÓû§Ãû£¬Õâ¸öÓû§ÃûÊÇÔڵǼ±íµ¥ÖÐÊäÈëµÄ£¬ÏÂÃæÕâÖÖ³¢ÊÔÓ¦¸ÃÊÇÄܹ¤×÷µÄ£º
<div ng-controller="navCtrl"> <span>{{user}}</span> <div ng-controller="loginCtrl"> <span>{{user}}</span> <input ng-model="user"></input> </div> </div> |
ÄÇôÎÊÌâÀ´ÁË¡¡£ºÔÚtext inputÖÐÉèÖÃÁËuserµÄng-model£¬µ±Óû§ÔÚÆäÖÐÊäÈëÄÚÈÝʱ£¬ÄĸöÄ£°æ»á±»¸üУ¿navCtrl»¹ÊÇloginCtrl£¬»¹ÊǶ¼»á£¿
Èç¹ûÄãÑ¡ÔñÁËloginCtrl£¬ÄÇôÄã¿ÉÄÜÒѾÀí½âÁËÔÐͼ̳ÐÊÇÈçºÎ¹¤×÷µÄÁË¡£
µ±Äã¼ìË÷×ÖÃæÖµÊ±£¬ÔÐÍÁ´²¢²»Æð×÷Óá£Èç¹ûnavCtrlҲͬʱ±»¸üÐµĻ°£¬¼ìË÷ÔÐÍÁ´ÊDZØÐëµÄ£»µ«Èç¹ûÖµÊÇÒ»¸ö¶ÔÏó£¬Õâ¾Í»á·¢Éú¡££¨¼Çס£¬ÔÚJavascriptÖУ¬º¯Êý¡¢Êý×éºÍ¶ÔÏó¶¼ÊǶÔÏó£©
ËùÒÔΪÁË»ñµÃÔ¤ÆÚµÄÐÐΪ£¬ÐèÒªÔÚnavCtrlÖд´½¨Ò»¸ö¶ÔÏó£¬Ëü¿ÉÒÔ±»loginCtrlÒýÓá£
<div ng-controller="navCtrl"> <span>{{user.name}}</span> <div ng-controller="loginCtrl"> <span>{{user.name}}</span> <input ng-model="user.name"></input> </div> </div> |
ÏÖÔÚ£¬ÓÉÓÚuserÊÇÒ»¸ö¶ÔÏó£¬ÔÐÍÁ´¾Í»áÆð×÷Óã¬navCtrlÄ£°æºÍ$scopeºÍloginCtrl¶¼»á±»¸üС£
Õâ¿´ÉÏÈ¥ÊÇÒ»¸öºÜ×ö×÷µÄÀý×Ó£¬µ«Êǵ±ÄãʹÓÃijЩָÁîÈ¥´´½¨×Ó$scope£¬ÈçngRepeatʱ£¬Õâ¸öÎÊÌâºÜÈÝÒ׾ͻá²úÉú¡£
9. ÊÖ¹¤²âÊÔ
ÓÉÓÚTDD¿ÉÄܲ»ÊÇÿ¸ö¿ª·¢ÈËÔ±¶¼Ï²»¶µÄ¿ª·¢·½Ê½£¬Òò´Ëµ±¿ª·¢ÈËÔ±¼ì²é´úÂëÊÇ·ñ¹¤×÷»òÊÇ·ñÓ°ÏìÁËÆäËü¶«Î÷ʱ£¬ËûÃÇ»á×öÊÖ¹¤²âÊÔ¡£
²»È¥²âÊÔAngularJS app£¬ÕâÊÇûÓеÀÀíµÄ¡£AngularJSµÄÉè¼ÆÊ¹µÃËü´ÓÍ·µ½µ×¶¼ÊǿɲâÊԵģ¬ÒÀÀµ×¢ÈëºÍngMockÄ£¿é¾ÍÊÇÃ÷Ö¤¡£AngularJSºËÐÄÍŶÓÒѾ¿ª·¢ÁËÖÚ¶àÄܹ»Ê¹²âÊÔ¸üÉÏÒ»²ãÂ¥µÄ¹¤¾ß¡£
9.1 Protractor
µ¥Ôª²âÊÔÊÇÒ»¸ö²âÊÔ¹¤×÷µÄ»ù´¡£¬µ«¿¼Âǵ½appµÄÈÕÒæ¸´ÔÓ£¬¼¯³É²âÊÔ¸üÌù½üʵ¼ÊÇé¿ö¡£ÐÒÔ˵ÄÊÇ£¬AngularJSµÄºËÐÄÍŶÓÒѾÌṩÁ˱ØÒªµÄ¹¤¾ß¡£
ÎÒÃÇÒѾ½¨Á¢ÁËProtractor£¬Ò»¸ö¶Ëµ½¶ËµÄ²âÊÔÆ÷ÓÃÒÔÄ£ÄâÓû§½»»¥£¬ÕâÄܹ»°ïÖúÄãÑéÖ¤ÄãµÄAngularJS³ÌÐòµÄ½¡¿µ×´¿ö¡£
ProtractorʹÓÃJasmine²âÊÔ¿ò¼Ü¶¨Òå²âÊÔ£¬ProtractorÕë¶Ô²»Í¬µÄÒ³Ãæ½»»¥ÐÐΪÓÐÒ»¸ö·Ç³£½¡×³µÄAPI¡£
ÎÒÃÇ»¹ÓÐһЩÆäËûµÄ¶Ëµ½¶Ë²âÊÔ¹¤¾ß£¬µ«ÊÇProtractorµÄÓÅÊÆÊÇËüÄܹ»Àí½âÈçºÎÓëAngularJS´úÂëÐͬ¹¤×÷£¬ÓÈÆäÊÇÔÚ$digestÖÜÆÚÖС£
9.2 Karma
Ò»µ©ÎÒÃÇÓÃProtractorÍê³ÉÁ˼¯³É²âÊԵıàд¹¤×÷£¬½ÓÏÂÈ¥¾ÍÊÇÖ´ÐвâÊÔÁË¡£µÈ´ý²âÊÔÖ´ÐУ¬ÓÈÆäÊǼ¯³É²âÊÔ£¬¶Ôÿ¸ö¿ª·¢ÈËÔ±¶¼ÊÇÒ»ÖÖµµµÄÓÇÉË¡£AngularJSµÄºËÐÄÍŶÓÒ²¸Ðµ½¼«Îªµ°ÌÛ£¬ÓÚÊÇËûÃÇ¿ª·¢ÁËKarma¡£
KarmaÊÇÒ»¸ö²âÊÔÆ÷£¬ËüÓÐÖúÓڹرշ´À¡»ØÂ·¡£KarmaÖ®ËùÒÔÄܹ»×öµ½Õâµã£¬ÊÇÒòΪËüÔÚÖ¸¶¨Îļþ±»¸Ä±äʱ¾ÍÔËÐвâÊÔ¡£KarmaͬʱҲ»áÔÚ¶à¸öä¯ÀÀÆ÷ÉÏÔËÐвâÊÔ£¬²»Í¬µÄÉ豸Ҳ¿ÉÒÔÖ¸ÏòKarma·þÎñÆ÷£¬ÕâÑù¾ÍÄܹ»¸üºÃµØ¸²¸ÇÕæÊµÊÀ½çµÄÓ¦Óó¡¾°¡£
10. ʹÓÃjQuery
jQueryÊÇÒ»¸ö¿áìŵĿ⣬ËüÓбê×¼»¯µÄ¿çƽ̨¿ª·¢£¬¼¸ºõÒѾ³ÉΪÁËÏÖ´ú»¯Web¿ª·¢µÄ±ØÐèÆ·¡£²»¹ý¾¡¹ÜJQueryÈç´Ë¶àµÄÓÅÐãÌØÐÔ£¬ËüµÄÀíÄîºÍAngularJS²¢²»Ò»Ö¡£
AngularJSÊÇÒ»¸öÓÃÀ´½¨Á¢appµÄ¿ò¼Ü£¬¶øJQueryÔòÊÇÒ»¸ö¼ò»¯¡°HTMLÎĵµ²Ù×÷¡¢Ê¼þ´¦Àí¡¢¶¯»ºÍAjax¡±µÄ¿â¡£ÕâÊÇÁ½Õß×î»ù±¾µÄÇø±ð£¬AngularJSÖÂÁ¦ÓÚ³ÌÐòµÄÌåϵ½á¹¹£¬ÓëHTMLÒ³ÃæÎ޹ء£
ΪÁ˸üºÃµÄÀí½âÈçºÎ½¨Á¢Ò»¸öAngularJS³ÌÐò£¬ÇëֹͣʹÓÃjQuery¡£JQueryʹ¿ª·¢ÈËÔ±ÒÔÏÖ´æµÄHTML±ê׼˼¿¼ÎÊÌ⣬µ«ÕýÈçÎĵµÀïËù˵µÄ£¬¡°AngularJSÄܹ»ÈÃÄãÔÚÓ¦ÓóÌÐòÖÐÀ©ÕÅHTMLÕâ¸ö´Ê»ã¡±¡£
DOM²Ù×÷Ó¦¸ÃÖ»ÔÚÖ¸ÁîÖÐÍê³É£¬µ«Õâ²¢²»Òâζ×ÅËûÃÇÖ»ÄÜÓÃJQuery·â×°¡£ÔÚÄãʹÓÃJQuery֮ǰ£¬ÄãÓ¦¸Ã×ÜÊÇÈ¥ÏëÒ»ÏÂÕâ¸ö¹¦ÄÜÊDz»ÊÇAngularJSÒѾÌṩÁË¡£µ±Ö¸ÁÏàÒÀÀµÊ±Äܹ»´´½¨Ç¿´óµÄ¹¤¾ß£¬ÕâȷʵºÜÇ¿´ó¡£
µ«Ò»¸ö·Ç³£°ôµÄJQueryÊDZØÐèÆ·Ê±£¬ÕâÒ»Ìì¿ÉÄܻᵽÀ´£¬µ«ÔÚÒ»¿ªÊ¼¾ÍÒýÈëËü£¬ÊÇÒ»¸ö³£¼ûµÄ´íÎó¡£
½áÂÛ
AngularJSÊÇһ׿ԽµÄ¿ò¼Ü£¬ÔÚÉçÇøµÄ°ïÖúÏÂʼÖÕÔÚ½ø²½¡£Ëä˵AngularJSÈÔÈ»ÊÇÒ»¸ö²»¶Ï·¢Õ¹µÄ¸ÅÄµ«ÎÒÏ£ÍûÈËÃÇÄܹ»×ñÑÒÔÉÏ̸µ½µÄÕâЩԼ¶¨£¬±ÜÃ⿪·¢AngularJSÓ¦ÓÃËùÓöµ½µÄÄÇЩÎÊÌâ¡£ |