Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
AngularJS¿ª·¢ÈËÔ±×î³£·¸µÄ10¸ö´íÎó
 
À´Ô´£ºMark Meyer ·¢²¼ÓÚ 2017-3-27
  1877  次浏览      48
 

¼ò½é

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Ó¦ÓÃËùÓöµ½µÄÄÇЩÎÊÌâ¡£

   
1877 ´Îä¯ÀÀ       48
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢