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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
AngularJS Ö¸Áîʵ¼ùÖ¸ÄÏ£¨¶þ£©
 
À´Ô´£º²®ÀÖÔÚÏß ·¢²¼ÓÚ 2017-4-06
  1832  次浏览      34
 

Õâ¸öϵÁн̵̳ĵÚÒ»²¿·Ö¸ø³öÁËAngularJSÖ¸ÁîµÄ»ù±¾¸ÅÊö£¬ÔÚÎÄÕµÄ×îºóÎÒÃǽéÉÜÁËÈçºÎ¸ôÀëÒ»¸öÖ¸ÁîµÄscope¡£µÚ¶þ²¿·Ö½«³Ð½ÓÉÏһƪ¼ÌÐø½éÉÜ¡£Ê×ÏÈ£¬ÎÒÃǻῴµ½ÔÚʹÓøôÀëscopeµÄÇé¿öÏ£¬ÈçºÎ´ÓÖ¸ÁîÄÚ²¿·ÃÎʵ½¸¸scopeµÄÊôÐÔ¡£½Ó×Å£¬ÎÒÃÇ»á»ùÓÚ¶Ô controller º¯ÊýºÍ transclusions ÌÖÂÛÈçºÎΪָÁîÑ¡ÔñÕýÈ·µÄscope¡£ÕâÆªÎÄÕµÄ×îºó»áÒÔͨ¹ýÒ»¸öÍêÕûµÄ¼Çʱ¾Ó¦ÓÃÀ´Êµ¼ùÖ¸ÁîµÄʹÓá£

¸ôÀëscopeºÍ¸¸scopeÖ®¼äµÄÊý¾Ý°ó¶¨

ͨ³££¬¸ôÀëÖ¸ÁîµÄscope»á´øÀ´ºÜ¶àµÄ±ãÀû£¬ÓÈÆäÊÇÔÚÄãÒª²Ù×÷¶à¸öscopeÄ£Ð͵Äʱºò¡£µ«ÓÐʱΪÁËʹ´úÂëÄܹ»ÕýÈ·¹¤×÷£¬ÄãÒ²ÐèÒª´ÓÖ¸ÁîÄÚ²¿·ÃÎʸ¸scopeµÄÊôÐÔ¡£ºÃÏûÏ¢ÊÇAngular¸øÁËÄã×ã¹»µÄÁé»îÐÔÈÃÄãÄܹ»ÓÐÑ¡ÔñÐÔµÄͨ¹ý°ó¶¨µÄ·½Ê½´«È븸scopeµÄÊôÐÔ¡£ÈÃÎÒÃÇÖØÎÂÒ»ÏÂÎÒÃÇµÄ helloWorld Ö¸ÁËüµÄ±³¾°É«»áËæ×ÅÓû§ÔÚÊäÈë¿òÖÐÊäÈëµÄÑÕÉ«Ãû³Æ¶ø±ä»¯¡£»¹¼ÇµÃµ±ÎÒÃǶÔÕâ¸öÖ¸ÁîʹÓøôÀëscopeµÄÖ®ºó£¬Ëü²»Äܹ¤×÷ÁËÂð£¿ÏÖÔÚ£¬ÎÒÃÇÀ´ÈÃËü»Ö¸´Õý³£¡£

¼ÙÉèÎÒÃÇÒѾ­³õʼ»¯Íê³ÉappÕâ¸ö±äÁ¿ËùÖ¸ÏòµÄAngularÄ£¿é¡£ÄÇôÎÒÃÇµÄ helloWorld Ö¸ÁîÈçÏÂÃæ´úÂëËùʾ£º

app.directive('helloWorld', function() {
return {
scope: {},
restrict: 'AE',
replace: true,
template: '<p style="background-color:{{color}}">Hello World</p>',
link: function(scope, elem, attrs) {
elem.bind('click', function() {
elem.css('background-color','white');
scope.$apply(function() {
scope.color = "white";
});
});
elem.bind('mouseover', function() {
elem.css('cursor', 'pointer');
});
}
};
});

ʹÓÃÕâ¸öÖ¸ÁîµÄHTML±êÇ©ÈçÏ£º

<body ng-controller="MainCtrl">
<input type="text" ng-model="color" placeholder="Enter a color"/>
<hello-world/>
</body>

ÉÏÃæµÄ´úÂëÏÖÔÚÊDz»Äܹ¤×÷µÄ¡£ÒòΪÎÒÃÇÓÃÁËÒ»¸ö¸ôÀëµÄscope£¬Ö¸ÁîÄÚ²¿µÄ {{color}} ±í´ïʽ±»¸ôÀëÔÚÖ¸ÁîÄÚ²¿µÄscopeÖÐ(²»ÊǸ¸scope)¡£µ«ÊÇÍâÃæµÄÊäÈë¿òÔªËØÖÐµÄ ng-model Ö¸ÁîÊÇÖ¸Ïò¸¸scopeÖÐµÄ color ÊôÐԵġ£ËùÒÔ£¬ÎÒÃÇÐèÒªÒ»ÖÖ·½Ê½À´°ó¶¨¸ôÀëscopeºÍ¸¸scopeÖеÄÕâÁ½¸ö²ÎÊý¡£ÔÚAngularÖУ¬ÕâÖÖÊý¾Ý°ó¶¨¿ÉÒÔͨ¹ýΪָÁîËùÔÚµÄHTMLÔªËØÌí¼ÓÊôÐԺͲ¢Ö¸ÁÒå¶ÔÏóÖÐÅäÖÃÏàÓ¦µÄ scope ÊôÐÔÀ´ÊµÏÖ¡£ÈÃÎÒÃÇÀ´Ï¸¾¿Ò»Ï½¨Á¢Êý¾Ý°ó¶¨µÄ¼¸ÖÖ·½Ê½¡£

Ñ¡ÔñÒ»£ºÊ¹Óà @ ʵÏÖµ¥ÏòÎı¾°ó¶¨

ÔÚÏÂÃæµÄÖ¸ÁÒåÖУ¬ÎÒÃÇÖ¸¶¨Á˸ôÀëscopeÖеÄÊôÐÔ color °ó¶¨µ½Ö¸ÁîËùÔÚHTMLÔªËØÉϵIJÎÊý colorAttr¡£ÔÚHTML±ê¼ÇÖУ¬Äã¿ÉÒÔ¿´µ½ {{color}}±í´ïʽ±»Ö¸¶¨¸øÁË color-attr ²ÎÊý¡£µ±±í´ïʽµÄÖµ·¢Éú¸Ä±äʱ£¬color-attr ²ÎÊýÒ²¸úןı䡣¸ôÀëscopeÖÐµÄ color ÊôÐÔµÄÖµÒ²ÏàÓ¦µØ±»¸Ä±ä¡£

app.directive('helloWorld', function() {
return {
scope: {
color: '@colorAttr'
},
....
// the rest of the configurations
};
});

¸üкóµÄHTML±ê¼Ç´úÂëÈçÏ£º

<body ng-controller="MainCtrl">
<input type="text" ng-model="color" placeholder="Enter a color"/>
<hello-world color-attr="{{color}}"/>
</body>

ÎÒÃdzÆÕâÖÖ·½Ê½Îªµ¥Ïî°ó¶¨£¬ÊÇÒòΪÔÚÕâÖÖ·½Ê½Ï£¬ÄãÖ»Äܽ«×Ö·û´®(ʹÓñí´ïʽ{{}})´«µÝ¸ø²ÎÊý¡£µ±¸¸scopeµÄÊôÐԱ仯ʱ£¬ÄãµÄ¸ôÀëscopeÄ£ÐÍÖеÄÊôÐÔÖµ¸ú×ű仯¡£ÄãÉõÖÁ¿ÉÒÔÔÚÖ¸ÁîÄÚ²¿¼à¿ØÕâ¸öscopeÊôÐԵı仯£¬²¢ÇÒ´¥·¢Ò»Ð©ÈÎÎñ¡£È»¶ø£¬·´ÏòµÄ´«µÝ²¢²»¹¤×÷¡£Äã²»ÄÜͨ¹ý¶Ô¸ôÀëscopeÊôÐԵIJÙ×÷À´¸Ä±ä¸¸scopeµÄÖµ¡£

×¢Òâµã£º

µ±¸ôÀëscopeÊôÐÔºÍÖ¸ÁîÔªËØ²ÎÊýµÄÃû×ÖÒ»ÑùÊÇ£¬Äã¿ÉÒÔ¸ü¼òµ¥µÄ·½Ê½ÉèÖÃscope°ó¶¨£º

app.directive('helloWorld', function() {
return {
scope: {
color: '@'
},
....
// the rest of the configurations
};
});

ÏàӦʹÓÃÖ¸ÁîµÄHTML´úÂëÈçÏ£º

<hello-world color="{{color}}"/>

Ñ¡Ôñ¶þ£ºÊ¹Óà = ʵÏÖË«Ïò°ó¶¨

ÈÃÎÒÃǽ«Ö¸ÁîµÄ¶¨Òå¸Ä±ä³ÉÏÂÃæµÄÑù×Ó£º

app.directive('helloWorld', function() {
return {
scope: {
color: '='
},
....
// the rest of the configurations
};
});

ÏàÓ¦µÄHTMLÐÞ¸ÄÈçÏ£º

<body ng-controller="MainCtrl">
<input type="text" ng-model="color" placeholder="Enter a color"/>
<hello-world color="color"/>
</body>

Óë @ ²»Í¬£¬ÕâÖÖ·½Ê½ÈÃÄãÄܹ»¸øÊôÐÔÖ¸¶¨Ò»¸öÕæÊµµÄscopeÊý¾ÝÄ£ÐÍ£¬¶ø²»ÊǼòµ¥µÄ×Ö·û´®¡£ÕâÑùÄã¾Í¿ÉÒÔ´«µÝ¼òµ¥µÄ×Ö·û´®¡¢Êý×é¡¢ÉõÖÁ¸´ÔӵĶÔÏó¸ø¸ôÀëscope¡£Í¬Ê±£¬»¹Ö§³ÖË«ÏòµÄ°ó¶¨¡£Ã¿µ±¸¸scopeÊôÐԱ仯ʱ£¬Ïà¶ÔÓ¦µÄ¸ôÀëscopeÖеÄÊôÐÔÒ²¸úןı䣬·´Ö®ÒàÈ»¡£ºÍ֮ǰµÄÒ»Ñù£¬ÄãÒ²¿ÉÒÔ¼àÊÓÕâ¸öscopeÊôÐԵı仯¡£

Ñ¡ÔñÈý£ºÊ¹Óà & ÔÚ¸¸scopeÖÐÖ´Ðк¯Êý

ÓÐʱºò´Ó¸ôÀëscopeÖе÷Óø¸scopeÖж¨ÒåµÄº¯ÊýÊǷdz£ÓбØÒªµÄ¡£ÎªÁËÄܹ»·ÃÎÊÍⲿscopeÖж¨ÒåµÄº¯Êý£¬ÎÒÃÇʹÓà &¡£±ÈÈçÎÒÃÇÏëÒª´ÓÖ¸ÁîÄÚ²¿µ÷Óà sayHello() ·½·¨¡£ÏÂÃæµÄ´úÂë¸æËßÎÒÃǸÃÔõô×ö£º

app.directive('sayHello', function() {
return {
scope: {
sayHelloIsolated: '&amp;'
},
....
// the rest of the configurations
};
});

ÏàÓ¦µÄHTML´úÂëÈçÏ£º

<body ng-controller="MainCtrl">
<input type="text" ng-model="color" placeholder="Enter a color"/>
<say-hello sayHelloIsolated="sayHello()"/>
</body>

Õâ¸ö Plunker Àý×Ó¶ÔÉÏÃæµÄ¸ÅÄî×öÁ˺ܺõÄÚ¹ÊÍ¡£

¸¸scope¡¢×ÓscopeÒÔ¼°¸ôÀëscopeµÄÇø±ð

×÷Ϊһ¸öAngularµÄÐÂÊÖ£¬Äã¿ÉÄÜ»áÔÚÑ¡ÔñÕýÈ·µÄÖ¸ÁîscopeµÄʱºò¸Ðµ½À§»ó¡£Ä¬ÈÏÇé¿öÏ£¬Ö¸Áî²»»á´´½¨Ò»¸öеÄscope£¬¶øÊÇÑØÓø¸scope¡£µ«ÊÇÔںܶàÇé¿öÏ£¬Õâ²¢²»ÊÇÎÒÃÇÏëÒªµÄ¡£Èç¹ûÄãµÄÖ¸ÁîÖØ¶ÈµØÊ¹Óø¸scopeµÄÊôÐÔ¡¢ÉõÖÁ´´½¨ÐµÄÊôÐÔ£¬»áÎÛȾ¸¸scope¡£ÈÃËùÓеÄÖ¸ÁʹÓÃͬһ¸ö¸¸scope²»»áÊÇÒ»¸öºÃÖ÷Ò⣬ÒòΪÈκÎÈ˶¼¿ÉÄÜÐÞ¸ÄÕâ¸öscopeÖеÄÊôÐÔ¡£Òò´Ë£¬ÏÂÃæµÄÕâ¸öÔ­ÔòÒ²Ðí¿ÉÒÔ°ïÖúÄãΪÄãµÄÖ¸ÁîÑ¡ÔñÕýÈ·µÄscope¡£

1.¸¸scope(scope: false) ¨C ÕâÊÇĬÈÏÇé¿ö¡£Èç¹ûÄãµÄÖ¸Áî²»²Ù×÷¸¸scoeµÄÊôÐÔ£¬Äã¾Í²»ÐèÒªÒ»¸öеÄscope¡£ÕâÖÖÇé¿öÏÂÊÇ¿ÉÒÔʹÓø¸scopeµÄ¡£

2.×Óscope(scope: true) ¨C Õâ»áΪָÁî´´½¨Ò»¸öеÄscope£¬²¢ÇÒÔ­Ðͼ̳Ð×Ô¸¸scope¡£Èç¹ûÄãµÄÖ¸ÁîscopeÖеÄÊôÐԺͷ½·¨ÓëÆäËûµÄÖ¸ÁîÒÔ¼°¸¸scope¶¼Ã»ÓйØÏµµÄʱºò£¬ÄãÓ¦¸Ã´´½¨Ò»¸öÐÂscope¡£ÔÚÕâÖÖ·½Ê½Ï£¬ÄãͬÑùÓµÓи¸scopeÖÐËù¶¨ÒåµÄÊôÐԺͷ½·¨¡£

3.¸ôÀëscope(scope:{}) ¨C Õâ¾ÍÏñÒ»¸öɳÏ䣡µ±Äã´´½¨µÄÖ¸ÁîÊÇ×Ô°üº¬µÄ²¢ÇÒ¿ÉÖØÓõģ¬Äã¾ÍÐèҪʹÓÃÕâÖÖscope¡£ÄãÔÚÖ¸ÁîÖлᴴ½¨ºÜ¶àscopeÊôÐԺͷ½·¨£¬ËüÃǽöÔÚÖ¸ÁîÄÚ²¿Ê¹Óã¬ÓÀÔ¶²»»á±»ÍⲿµÄÊÀ½çËùÖªÏþ¡£Èç¹ûÊÇÕâÑùµÄ»°£¬¸ôÀëµÄscopeÊǸüºÃµÄÑ¡Ôñ¡£¸ôÀëµÄscope²»»á¼Ì³Ð¸¸scope¡£

Transclusion£¨Ç¶È룩

TransclusionÊÇÈÃÎÒÃǵÄÖ¸Áî°üº¬ÈÎÒâÄÚÈݵķ½·¨¡£ÎÒÃÇ¿ÉÒÔÑÓʱÌáÈ¡²¢ÔÚÕýÈ·µÄscopeϱàÒëÕâЩǶÈëµÄÄÚÈÝ£¬×îÖÕ½«ËüÃÇ·ÅÈëÖ¸ÁîÄ£°åÖÐÖ¸¶¨µÄλÖᣠÈç¹ûÄãÔÚÖ¸ÁÒåÖÐÉèÖà transclude:true£¬Ò»¸öеÄǶÈëµÄscope»á±»´´½¨£¬ËüÔ­Ðͼ̳Ð×Ó¸¸scope¡£ Èç¹ûÄãÏëÒªÄãµÄÖ¸ÁîʹÓøôÀëµÄscope£¬µ«ÊÇËüËù°üº¬µÄÄÚÈÝÄܹ»ÔÚ¸¸scopeÖÐÖ´ÐУ¬transclusionÒ²¿ÉÒÔ°ïæ¡£

¼ÙÉèÎÒÃÇ×¢²áÒ»¸öÈçϵÄÖ¸Á

app.directive('outputText', function() {
return {
transclude: true,
scope: {},
template: '<div ng-transclude></div>'
};
});

ËüʹÓÃÈçÏ£º

<div output-text>
<p>Hello {{name}}</p>
</div>

ng-transclude Ö¸Ã÷ÔÚÄÄÀï·ÅÖñ»Ç¶ÈëµÄÄÚÈÝ¡£ÔÚÕâ¸öÀý×ÓÖÐDOMÄÚÈÝ <p>Hello {{name}}</p> ±»ÌáÈ¡ºÍ·ÅÖõ½ <div ng-transclude></div> ÄÚ²¿¡£ÓÐÒ»¸öºÜÖØÒªµÄµãÐèҪעÒâµÄÊÇ£¬±í´ïʽ{{name}}Ëù¶ÔÓ¦µÄÊôÐÔÊÇÔÚ¸¸scopeÖб»¶¨ÒåµÄ£¬¶ø·Ç×Óscope¡£Äã¿ÉÒÔÔÚÕâ¸öPlunkerÀý×ÓÖÐ×öһЩʵÑé¡£Èç¹ûÄãÏëҪѧϰ¸ü¶à¹ØÓÚscopeµÄ֪ʶ£¬¿ÉÒÔÔĶÁÕâÆªÎÄÕ¡£

transclude:¡¯element¡¯ ºÍ transclude:trueµÄÇø±ð

ÓÐʱºòÎÒÎÒÃÇҪǶÈëÖ¸ÁîÔªËØ±¾Éí£¬¶ø²»½ö½öÊÇËüµÄÄÚÈÝ¡£ÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃÇÐèҪʹÓà transclude:¡¯element¡¯¡£ËüºÍ transclude:true ²»Í¬£¬Ëü½«±ê¼ÇÁË ng-transclude Ö¸ÁîµÄÔªËØÒ»Æð°üº¬µ½ÁËÖ¸ÁîÄ£°åÖС£Ê¹ÓÃtransclusion£¬ÄãµÄlinkº¯Êý»á»ñµÃÒ»¸öÃû½Ð transclude µÄÁ´½Óº¯Êý£¬Õâ¸öº¯Êý°ó¶¨ÁËÕýÈ·µÄÖ¸Áîscope£¬²¢ÇÒ´«ÈëÁËÁíÒ»¸öÓµÓб»Ç¶ÈëDOMÔªËØ¿½±´µÄº¯Êý¡£Äã¿ÉÒÔÔÚÕâ¸ö transclude º¯ÊýÖÐÖ´ÐбÈÈçÐÞ¸ÄÔªËØ¿½±´»òÕß½«ËüÌí¼Óµ½DOMÉϵȲÙ×÷¡£ ÀàËÆ ng-repeat ÕâÑùµÄÖ¸ÁîʹÓÃÕâÖÖ·½Ê½À´Öظ´DOMÔªËØ¡£×ÐϸÑо¿Ò»ÏÂÕâ¸öPlunker£¬ËüʹÓÃÕâÖÖ·½Ê½¸´ÖÆÁËDOMÔªËØ£¬²¢ÇҸıäÁ˵ڶþ¸öʵÀýµÄ±³¾°É«¡£

ͬÑùÐèҪעÒâµÄÊÇ£¬ÔÚʹÓà transclude:¡¯element¡¯µÄʱºò£¬Ö¸ÁîËùÔÚµÄÔªËØ»á±»×ª»»³ÉHTML×¢ÊÍ¡£ËùÒÔ£¬Èç¹ûÄã½áºÏʹÓà transclude:¡¯element¡¯ ºÍ replace:false£¬ÄÇôָÁîÄ£°å±¾ÖÊÉÏÊDZ»Ìí¼Óµ½ÁË×¢Ê͵ÄinnerHTMLÖСª¡ªÒ²¾ÍÊÇ˵Æäʵʲô¶¼Ã»Óз¢Éú£¡Ïà·´£¬Èç¹ûÄãÑ¡ÔñʹÓà replace:true£¬Ö¸ÁîÄ£°å»áÌæ»»HTML×¢ÊÍ£¬ÄÇôһÇоͻáÈç¹ûËùÔ¸µÄ¹¤×÷¡£Ê¹Óà replade:false ºÍ transclue:¡¯element¡¯ÓÐʱºòÒ²ÊÇÓÐÓõ쬱ÈÈçµ±ÄãÐèÒªÖØ¸´DOMÔªËØµ«ÊDz¢²»Ïë±£ÁôµÚÒ»¸öÔªËØÊµÀý£¨Ëü»á±»×ª»»³É×¢ÊÍ£©µÄÇé¿öÏ¡£¶ÔÕâ¿é»¹ÓÐÒÉ»óµÄͬѧ¿ÉÒÔÔĶÁstackoverflowÉϵÄÕâÆªÌÖÂÛ£¬½éÉܵıȽÏÇåÎú¡£

controller º¯ÊýºÍ require

Èç¹ûÄãÏëÒªÔÊÐíÆäËûµÄÖ¸ÁîºÍÄãµÄÖ¸Áî·¢Éú½»»¥Ê±£¬ÄãÐèҪʹÓà controller º¯Êý¡£±ÈÈçÓÐЩÇé¿öÏ£¬ÄãÐèҪͨ¹ý×éºÏÁ½¸öÖ¸ÁîÀ´ÊµÏÖÒ»¸öUI×é¼þ¡£ÄÇôÄã¿ÉÒÔͨ¹ýÈçϵķ½Ê½À´¸øÖ¸ÁîÌí¼ÓÒ»¸ö controller º¯Êý¡£

app.directive('outerDirective', function() {
return {
scope: {},
restrict: 'AE',
controller: function($scope, $compile, $http) {
// $scope is the appropriate scope for the directive
this.addChild = function(nestedDirective) { // this refers to the controller
console.log('Got the message from nested directive:' + nestedDirective.message);
};
}
};
});

Õâ¸ö´úÂëΪָÁîÌí¼ÓÁËÒ»¸öÃû½Ð outerDirective µÄcontroller¡£µ±ÁíÒ»¸öÖ¸ÁîÏëÒª½»»¥Ê±£¬ËüÐèÒªÉùÃ÷Ëü¶ÔÄãµÄÖ¸Áî controller ʵÀýµÄÒýÓÃ(require)¡£¿ÉÒÔͨ¹ýÈçϵķ½Ê½ÊµÏÖ£º

app.directive('innerDirective', function() {
return {
scope: {},
restrict: 'AE',
require: '^outerDirective',
link: function(scope, elem, attrs, controllerInstance) {
//the fourth argument is the controller instance you require
scope.message = "Hi, Parent directive";
controllerInstance.addChild(scope);
}
};
});

ÏàÓ¦µÄHTML´úÂëÈçÏ£º

<outer-directive>
<inner-directive></inner-directive>
</outer-directive>

require: ¡®^outerDirective¡¯ ¸æËßAngularÔÚÔªËØÒÔ¼°ËüµÄ¸¸ÔªËØÖÐËÑË÷controller¡£ÕâÑù±»ÕÒµ½µÄ controller ʵÀý»á×÷ΪµÚËĸö²ÎÊý±»´«Èëµ½ link º¯ÊýÖС£ÔÚÎÒÃǵÄÀý×ÓÖУ¬ÎÒÃǽ«Ç¶ÈëµÄÖ¸ÁîµÄscope·¢Ë͸ø¸¸Ç×Ö¸Áî¡£Èç¹ûÄãÏë³¢ÊÔÕâ¸ö´úÂëµÄ»°£¬ÇëÔÚ¿ªÆôä¯ÀÀÆ÷¿ØÖÆÌ¨µÄÇé¿öÏ´ò¿ªÕâ¸öPlunker¡£Í¬Ê±£¬ÕâÆªAngular¹Ù·½ÎĵµÉϵÄ×îºó²¿·Ö¸øÁËÒ»¸ö·Ç³£ºÃµÄ¹ØÓÚÖ¸Áî½»»¥µÄÀý×Ó£¬ÊǷdz£ÖµµÃÒ»¶ÁµÄ¡£

Ò»¸ö¼Çʱ¾Ó¦ÓÃ

ÕâÒ»²¿·Ö£¬ÎÒÃÇʹÓÃAngularÖ¸Áî´´½¨Ò»¸ö¼òµ¥µÄ¼Çʱ¾Ó¦Óá£ÎÒÃÇ»áʹÓÃHTML5µÄ localStorage À´´æ´¢±Ê¼Ç¡£×îÖյIJúÆ·ÔÚÕâÀÄã¿ÉÒÔÏȶÃΪ¿ì¡£

ÎÒÃǻᴴ½¨Ò»¸öÕ¹ÏÖ¼Çʱ¾µÄÖ¸Áî¡£Óû§¿ÉÒԲ鿴Ëû/Ëý´´½¨¹ýµÄ±Ê¼Ç¼Ç¼¡£µ±Ëûµã»÷ add new °´Å¥µÄʱºò£¬¼Çʱ¾»á½øÈë¿É±à¼­×´Ì¬£¬²¢ÇÒÔÊÐí´´½¨Ðµıʼǡ£µ±µã»÷ back °´Å¥µÄʱºò£¬Ðµıʼǻᱻ×Ô¶¯±£´æ¡£±Ê¼ÇµÄ±£´æÊ¹ÓÃÁËÒ»¸öÃû½Ð noteFactory µÄ¹¤³§À࣬ËüʹÓÃÁË localStorage¡£¹¤³§ÀàÖеĴúÂëÊǷdz£Ö±½ÓºÍ¿ÉÀí½âµÄ¡£ËùÒÔÎÒÃǾͼ¯ÖÐÌÖÂÛÖ¸ÁîµÄ´úÂë¡£

µÚÒ»²½

ÎÒÃÇ´Ó×¢²á notepad Ö¸Áʼ¡£

app.directive('notepad', function(notesFactory) {
return {
restrict: 'AE',
scope: {},
link: function(scope, elem, attrs) {
},
templateUrl: 'templateurl.html'
};
});

ÕâÀïÓм¸µãÐèҪעÒâµÄ£º

1.ÒòΪÎÒÃÇÏëÈÃÖ¸Áî¿ÉÖØÓã¬ËùÒÔÑ¡ÔñʹÓøôÀëµÄscope¡£Õâ¸öÖ¸Áî¿ÉÒÔÓµÓкܶàÓëÍâ½çûÓйØÁªµÄÊôÐԺͷ½·¨¡£

2.Õâ¸öÖ¸Áî¿ÉÒÔÒÔÊôÐÔ»òÕßÔªËØµÄ·½Ê½±»Ê¹Óã¬Õâ¸ö±»¶¨ÒåÔÚ restrict ÊôÐÔÖС£

3.ÏÖÔÚµÄlinkº¯ÊýÊǿյÄ

4.Õâ¸öÖ¸Áî´Ó templateurl.html ÖлñȡָÁîÄ£°å

µÚ¶þ²½

ÏÂÃæµÄHTML×é³ÉÁËÖ¸ÁîµÄÄ£°å¡£

<div class="note-area" ng-show="!editMode">
<ul>
<li ng-repeat="note in notes|orderBy:'id'">
<a href="#" ng-click="openEditor(note.id)">{{note.title}}</a>
</li>
</ul>
</div>
<div id="editor" ng-show="editMode" class="note-area"
contenteditable="true" ng-bind="noteText"></div>
<span><a href="#" ng-click="save()" ng-show="editMode">Back</a></span>
<span><a href="#" ng-click="openEditor()" ng-show="!editMode">Add Note</a></span>

¼¸¸öÖØÒªµÄ×¢Òâµã£º

1.note ¶ÔÏóÖзâ×°ÁË title£¬id ºÍ content¡£

2.ng-repeat ÓÃÀ´±éÀú notes ÖÐËùÓеıʼǣ¬²¢ÇÒ°´ÕÕ×Ô¶¯Éú³ÉµÄ id ÊôÐÔ½øÐÐÉýÐòÅÅÐò¡£

3.ÎÒÃÇʹÓÃÒ»¸ö½Ð editMode µÄÊôÐÔÀ´Ö¸Ã÷ÎÒÃÇÏÖÔÚÔÚÄÄÖÖģʽÏ¡£Ôڱ༭ģʽÏ£¬Õâ¸öÊôÐÔµÄֵΪ true ²¢Çҿɱ༭µÄ div ½Úµã»áÏÔʾ¡£Óû§ÔÚÕâÀïÊäÈë×Ô¼ºµÄ±Ê¼Ç¡£

4.Èç¹û editMode Ϊ false£¬ÎÒÃǾÍÔڲ鿴ģʽ£¬ÏÔʾËùÓÐµÄ notes¡£

5.Á½¸ö°´Å¥Ò²ÊÇ»ùÓÚ editMode µÄÖµ¶øÏÔʾºÍÒþ²Ø¡£

6.ng-click Ö¸ÁîÓÃÀ´ÏìÓ¦°´Å¥µÄµã»÷ʼþ¡£ÕâЩ·½·¨½«ºÍ editMode Ò»ÆðÌí¼Óµ½scopeÖС£

7.¿É±à¼­µÄ div ¿òÓë noteText Ïà°ó¶¨£¬´æ·ÅÁËÓû§ÊäÈëµÄÎı¾¡£Èç¹ûÄãÏë±à¼­Ò»¸öÒÑ´æÔڵıʼǣ¬ÄÇôÕâ¸öÄ£ÐÍ»áÓÃËüµÄÎı¾ÄÚÈݳõʼ»¯Õâ¸ö div ¿ò¡£

µÚÈý²½

ÎÒÃÇÔÚscopeÖд´½¨Ò»¸öÃû½Ð restore() µÄк¯Êý£¬ËüÓÃÀ´³õʼ»¯ÎÒÃÇÓ¦ÓÃÖеĸ÷ÖÖ¿ØÖÆÆ÷¡£ Ëü»áÔÚ link º¯ÊýÖ´ÐеÄʱºò±»µ÷Óã¬Ò²»áÔÚ save °´Å¥±»µã»÷µÄʱºòµ÷Óá£

scope.restore = function() {
scope.editMode = false;
scope.index = -1;
scope.noteText = '';
};

ÎÒÃÇÔÚ link º¯ÊýµÄÄÚ²¿´´½¨Õâ¸öº¯Êý¡£ editMode ºÍ noteText ֮ǰÒѾ­½âÊ͹ýÁË¡£ index ÓÃÀ´¸ú×Ùµ±Ç°ÕýÔڱ༭µÄ±Ê¼Ç¡£ µ±ÎÒÃÇÔÚ´´½¨Ò»¸öеıʼǵÄʱºò£¬index µÄÖµ»áÉè³É -1. ÎÒÃÇÔڱ༭һ¸öÒÑ´æÔڵıʼǵÄʱºò£¬Ëü°üº¬ÁËÄǸö note ¶ÔÏóµÄ id Öµ¡£

µÚËIJ½

ÏÖÔÚÎÒÃÇÒª´´½¨Á½¸öscopeº¯ÊýÀ´´¦Àí±à¼­ºÍ±£´æ²Ù×÷¡£

scope.openEditor = function(index) {
scope.editMode = true;

if (index !== undefined) {
scope.noteText = notesFactory.get(index).content;
scope.index = index;
} else {
scope.noteText = undefined;
}
};

scope.save = function() {
if (scope.noteText !== '') {
var note = {};

note.title = scope.noteText.length > 10 ? scope.noteText.substring(0, 10)
+ '. . .' : scope.noteText;
note.content = scope.noteText;
note.id = scope.index != -1 ? scope.index : localStorage.length;
scope.notes = notesFactory.put(note);
}

scope.restore();
};

ÕâÁ½¸öº¯ÊýÓм¸µãÐèҪעÒ⣺

1.openEditor Ϊ±à¼­Æ÷×ö×¼±¸¹¤×÷¡£Èç¹ûÎÒÃÇÔڱ༭һ¸ö±Ê¼Ç£¬Ëü»á»ñÈ¡µ±Ç°±Ê¼ÇµÄÄÚÈݲ¢ÇÒͨ¹ýʹÓà ng-bind ½«ÄÚÈݸüе½¿É±à¼­µÄ div ÖС£

2.Èç¹ûÎÒÃÇÔÚ´´½¨Ò»¸öеıʼǣ¬ÎÒÃǻὫ noteText ÉèÖÃ³É undefined£¬ÒԱ㵱ÎÒÃÇÔÚ±£´æ±Ê¼ÇµÄʱºò£¬´¥·¢ÏàÓ¦µÄ¼àÌýÆ÷¡£

3.Èç¹û index ²ÎÊýÊÇ undefined£¬Ëü±íÃ÷Óû§ÕýÔÚ´´½¨Ò»¸öеıʼǡ£

4.save º¯Êýͨ¹ýʹÓà notesFactory À´´æ´¢±Ê¼Ç¡£ÔÚ±£´æÍê³Éºó£¬Ëü»áˢРnotes Êý×飬´Ó¶ø¼àÌýÆ÷Äܹ»¼à²âµ½±Ê¼ÇÁбíµÄ±ä»¯£¬À´¼°Ê±¸üС£

5.save º¯Êýµ÷ÓÃÔÚÖØÖà controllers Ö®ºóµ÷ÓÃrestore()£¬´Ó¶ø¿ÉÒԴӱ༭ģʽ½øÈë²é¿´Ä£Ê½¡£

µÚÎå²½

ÔÚ link º¯ÊýÖ´ÐÐʱ£¬ÎÒÃdzõʼ»¯ notes Êý×飬²¢ÇÒΪ¿É±à¼­µÄ div ¿ò°ó¶¨Ò»¸ö keydown ʼþ£¬´Ó¶ø±£Ö¤ÎÒÃÇµÄ nodeText Ä£ÐÍÓë div ÖеÄÄÚÈݱ£³Öͬ²½¡£ÎÒÃÇʹÓÃÕâ¸ö noteText À´±£´æÎÒÃǵıʼÇÄÚÈÝ¡£

var editor = elem.find('#editor');

scope.restore(); // initialize our app controls
scope.notes = notesFactory.getAll(); // load notes

editor.bind('keyup keydown', function() {
scope.noteText = editor.text().trim();
});

µÚÁù²½

×îºó£¬ÎÒÃÇÔÚHTMLÈçͬʹÓÃÆäËûµÄHTMLÔªËØÒ»ÑùʹÓÃÎÒÃǵÄÖ¸ÁȻºó¿ªÊ¼×ö±Ê¼Ç°É¡£

<h1 class="title">The Note Making App</h1>
<notepad/>

×ܽá

Ò»¸öºÜÖØÒªµÄµãÐèҪעÒâµÄÊÇ£¬ÈκÎʹÓÃjQueryÄÜ×öµÄÊÂÇ飬ÎÒÃǶ¼ÄÜÓÃAngularÖ¸ÁîÀ´×öµ½£¬²¢ÇÒʹÓøüÉٵĴúÂë¡£ËùÒÔ£¬ÔÚʹÓÃjQuery֮ǰ£¬Ç뿼ÂÇÒ»ÏÂÎÒÃÇÄÜ·ñÔÚ²»½øÐÐDOM²Ù×÷µÄÇé¿öÏÂÒÔ¸üºÃµÄ·½Ê½À´Íê³ÉÈÎÎñ¡£ÊÔ×ÅʹÓÃAngularÀ´×îС»¯jQueryµÄʹÓðɡ£
ÔÙÀ´¿´Ò»ÏÂÎÒÃǵıʼDZ¾Ó¦Óã¬É¾³ý±Ê¼ÇµÄ¹¦Äܱ»¹ÊÒ⩵ôÁË¡£¹ÄÀø¶ÁÕßÃÇ×Ô¼ºÊµÑéºÍʵÏÖÕâ¸ö¹¦ÄÜ¡£ Äã¿ÉÒÔ´ÓGitHubÉÏϵ½Õâ¸öDemoµÄÔ´´úÂë¡£

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



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]

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Ó¦Óÿª·¢