AngularJS - рдХреНрдпрд╛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдирдЬреА-рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?



рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдПрдирдЬреА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ -рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢ , рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдореЗрдВ рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдЖрдЬ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИред



рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрддреНрд╡ рд╣реИрдВ рдЬреИрд╕реЗ рдЯреВрд▓рдЯрд┐рдк, рдкреЙрдкрдУрд╡рд░, рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдЗрддреНрдпрд╛рджрд┐ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рддрддреНрд╡ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдХрд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА - рд╕рднреА рдореЛрдбрд▓ рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рд╢рд░реАрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЭреВрда рдмреЛрд▓реЗрдВрдЧреА рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЗрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЗрддрдиреЗ рдкрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред



<div style="position: relative; overflow:hidden"> <button ng-click="visible = true">Greeting</button> <modal visible="visible"> Hello, Habr! </modal> </div>
      
      







рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдореВрд▓ рддрддреНрд╡ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдПрдХ рддрддреНрд╡ рдХреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИ:



 module.directive('modal',[ '$rootElement', function( $rootElement ){ return { restrict: 'E', ... link: function(scope, element){ element.appendTo($rootElement); scope.$on('$destroy', function(){ element.remove(); }); ... } } }] });
      
      







рдпрд╣реА рд╣реИ, рд╣рдо рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рд╕реЗ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореВрд▓ рддрддреНрд╡ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рддрддреНрд╡ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде ng-if



рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред



ng-if



рд╕реНрдерд┐рддрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ DOM рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рд▓реЛрдЧ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред



рдпрд╣рд╛рдБ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рджреНрд░рд╖реНрдЯрд╛ ng-if



рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реА рд╣реИрдВред

рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА document.createComment(' end ngIf: ' + $attr.ngIf + ' ');



рдФрд░ рдЪрд░ block.clone



рдореЗрдВ рджреЛ рдорд╛рди рд░рдЦреЗ рдЧрдП рд╣реИрдВ:





рдкреГрд╖реНрда рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рджреЗрдЦрддреЗ рд╣реИрдВ:





рдЗрд╕ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рд╣рд╛рд▓рдд ng-if="!task.id"



рдкреЙрдЬрд┐рдЯрд┐рд╡ рд╣реИ рдФрд░ рдЬрд┐рд╕ рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ DOM рдЯреНрд░реА рдореЗрдВ рд╣реИ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╣реИред рджреВрд╕рд░реА рд╢рд░реНрдд ng-if="validation.task.app_id"



рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред


рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рдмрдЪреНрдЪреЗ рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рдирд╖реНрдЯ рдХрд░реЗрдВ рдФрд░ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ ред рдФрд░ getBlockElements рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк:

 /** * Return the DOM siblings between the first and last node in the given array. * @param {Array} array like object * @returns {DOMElement} object containing the elements */ function getBlockElements(nodes) { var startNode = nodes[0], endNode = nodes[nodes.length - 1]; if (startNode === endNode) { return jqLite(startNode); } var element = startNode; var elements = [element]; do { element = element.nextSibling; if (!element) break; elements.push(element); } while (element !== endNode); return jqLite(elements); }
      
      





рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рджрд┐рдП рдЧрдП рдПрд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдФрд░ рдЖрдЦрд┐рд░реА рдиреЛрдб рдХреЗ рдмреАрдЪ рд░рд┐рдЯрд░реНрди рдбреАрдУрдПрдо рднрд╛рдИ рдмрд╣рди рд╣реИрдВред

рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреЛрдбреНрд╕ рддрд░реНрдХ рджреЛ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдореБрдЦреНрдп рддрддреНрд╡ рдХреЗ рдмреАрдЪ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП ng-if



рдирд┐рд░реНрджреЗрд╢ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕рдорд╛рдкрди рдЯрд┐рдкреНрдкрдгреА рдереА, рдФрд░ рдпрджрд┐ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдорд┐рд▓реА, рддреЛ рдпрд╣ рдореБрдЦреНрдп рдПрдХ рдХреЗ рдмрд╛рдж рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ (# рдХреЛрдгреАрдп-рдЕрдиреБрдкреНрд░рдпреЛрдЧ - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдореВрд▓ рддрддреНрд╡):

 <div id="angular-application"> ... <div style="position: relative; overflow: hidden"> <div style="position: absolute; right: 0; bottom: 0"> <modal ng-if="isFirstModal()" id="modal-1">...</modal> <modal ng-if="isSecondModal()" id="modal-2">...</modal> </div> <div style="position: absolute; left: 0; bottom: 0"> <popover ng-if="isFirstPopover()" id="popover-1">...</popover> <popover ng-if="isSecondPopover()" id="popover-2">...</popover> </div> </div> ... </div>
      
      





рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд HTML рдореЗрдВ рд╕рдВрдХрд▓рди:

 <div id="angular-application"> ... <div style="position: relative; overflow: hidden"> <div style="position: absolute; right: 0; bottom: 0"> <!-- ngIf: isFirstModal() --> <!-- end ngIf: isFirstModal() --> <!-- ngIf: isSecondModal() --> <!-- end ngIf: isSecondModal() --> </div> <div style="position: absolute; left: 0; bottom: 0"> <!-- ngIf: isFirstPopover() --> <!-- end ngIf: isFirstPopover() --> <!-- ngIf: isSecondPopover() --> <!-- end ngIf: isSecondPopover() --> </div> </div> ... <div id="popover-1" class="popover">...</div> <div id="modal-1" class="modal-window">...</div> <div id="modal-2" class="modal-window">...</div> <div id="popover-2" class="popover">...</div> </div>
      
      





рдпрд╣реА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ - рд╕рднреА рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдФрд░ рдкреЙрдкрдУрд╡рд░, рддрд╛рдХрд┐ рдкреЛрдЬрд┐рд╢рдирд┐рдВрдЧ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рди рд╣реЛ рдФрд░ рдЙрдирдХрд╛ рд▓реЗрдЖрдЙрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдмрдиреА рд░рд╣реАрдВред рдФрд░ рдЕрдм, getBlockElements рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ .- - #popover-1 , #modal-1 , #modal-2 , #popover-2 . ng-if="isFirstPopover()"



DOM .



:

:) . . , , , , . - , - ; . , , , ; ng-if . . , . , - enable; . , ng-if



, 600; , . : element.find('[append-to-root]').appendTo($rootElement);



ng-if



, :

<div ng-if="condition"> <my-custom-directive>...</my-custom-directive> </div>












All Articles