|
Õâ¸öϵÁн̵̳ĵÚÒ»²¿·Ö¸ø³öÁË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: '&' }, .... // 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
|
|
|
|
|
| Ïà¹ØÎÄÕ |
Ïà¹ØÎĵµ |
Ïà¹Ø¿Î³Ì |
|
|
|
|
|
|
|
|