рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд▓реЗрдЖрдЙрдЯ

рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдоред рдореИрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред

рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдЪрд╛рд╣рд┐рдП


рдЖрдЗрдП рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдлрд╝реАрд▓реНрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЖрдВрдЦ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ рдЬрд╛рдирддрд╛ рд╣реИ)

рдЫрд╡рд┐

<input ng-model="user.password" ng-minlength="6" form-password form-error="  6 "> 


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

  1. ng-model
  2. ng-minlength
  3. form-password - рдЗрдирдкреБрдЯ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдВрдЦ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ (рдкрд╛рд╕рд╡рд░реНрдб / рдкрд╛рда) рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ
  4. form-error - рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд▓рдВрдмреЗ рд╕рдордп рддрдХ рди рд╣реЛ рддреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдЯреВрд▓рдЯрд┐рдк рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ
  5. form-error-tooltip - рдЯреВрд▓рдЯрд┐рдк рдХреЛ рддрддреНрд╡ рдХреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рддрд╛ рд╣реИ
  6. form-error-tooltip-template - form-error-tooltip-template рд╕рд╛рде рд╕рд╣рд╛рдпрдХ рдирд┐рд░реНрджреЗрд╢
  7. tooltip - рдХреЛрдгреАрдп рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдирд┐рд░реНрджреЗрд╢, рдЬрд┐рд╕рдХрд╛ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ


рдкрд░рд┐рднрд╛рд╖рд╛


рдХреЛрдгреАрдп-ui.imtqy.com/bootstrap/#/tooltip рдФрд░ рдЙрд╕рдХреЗ рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рд╕реЗ рдЯреВрд▓рдЯрд┐рдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ рд╡рд╣ рдирд┐рд░реНрджреЗрд╢ рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╕реНрддреБ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ $tooltip рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдирд┐рд░реНрджреЗрд╢ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 .directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); }]) 


рджреВрд╕рд░рд╛ рдЯреВрд▓рдЯрд┐рдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдХрдореА рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдРрд╕рд╛ рддрддреНрд╡ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ directiveName +'-popup ' рдирд╛рдо рдХрд╛ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдпрд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (directiveName = tooltip рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ):

 '<div '+ directiveName +'-popup '+ 'title="'+startSym+'tt_title'+endSym+'" '+ 'content="'+startSym+'tt_content'+endSym+'" '+ 'placement="'+startSym+'tt_placement'+endSym+'" '+ 'animation="tt_animation" '+ 'is-open="tt_isOpen"'+ '>'+ '</div>'; 


рдиреАрдЪреЗ рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЗрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╣рддреЗ рд╣реИрдВ):

 .directive( 'tooltipPopup', function () { return { restrict: 'EA', replace: true, scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, templateUrl: 'template/tooltip/tooltip-popup.html' }; }) 


рдЯреЗрдореНрдкреНрд▓реЗрдЯ / рдЯреВрд▓рдЯрд┐рдк / рдЯреВрд▓рдЯрд┐рдк-рдкреЙрдкрдЕрдк.html рдкрд░, рд╣рдо рдЕрдВрдд рдореЗрдВ рдЯреВрд▓рдЯрд┐рдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдвреВрдВрдвреЗрдВрдЧреЗред

рдПрдХ рдкрд╛рдардХ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдРрд╕реА рдмрд┐рд▓реНрд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрдИ рдЯреВрд▓рдЯрд┐рдк рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛ рд╕рдХреЗрдВред

рдЖрдЗрдП рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдпреБрдХреНрддрд┐рдпрд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдПрдВред рдЯреВрд▓рдЯрд┐рдк рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдпрджрд┐ open рдШрдЯрдирд╛ рддрддреНрд╡ рдкрд░ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЕрдЧрд░ - close

 app.directive('formErrorTooltip', function($tooltip) { return $tooltip('formErrorTooltip', 'formErrorTooltip', 'open'); }); 


рдПрдХ рдкрдВрдХреНрддрд┐ред рдХреВрд▓?

рдирд╛рдо рдкреНрд░рдкрддреНрд░-рддреНрд░реБрдЯрд┐-рдЯреВрд▓рдЯрд┐рдк-рдкреЙрдкрдЕрдк рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдирд┐рд░реНрджреЗрд╢ рдирд╛рдо рдпрд╛рдж рд░рдЦреЗрдВ - '- рдкреЙрдкрдЕрдк')ред рдЯреВрд▓рдЯрд┐рдк-рдкреЙрдкрдЕрдк рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдмрдирд╛рдПрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдирд╛рдо рдФрд░ рдкрде рдХреА рдЬрдЧрд╣ред

open рдФрд░ close рдШрдЯрдирд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ред
 app.config(function($tooltipProvider) { $tooltipProvider.setTriggers({'open': 'close'}); }); 


рд╡рд┐рд╕реНрддрд╛рд░


рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ form-error-tooltip рд╣реИ рдЬреЛ рдПрд▓рд┐рдореЗрдВрдЯ form-error-tooltip рдХреЛ рдПрд▓рд┐рдореЗрдВрдЯ рд╕реЗ рдКрдкрд░ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдХреБрдЫ рдЕрдХреНрд╖рд░ рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ (рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдпрд╣ рд╕рд┐рдЦрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ)ред рд╣рдо form-error рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ рдкрд╣рд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛:

 app.directive('formError', function($compile, $interpolate, $injector) { return { terminal: true, priority: 100, scope: true, compile: function compile(tElement, tAttrs) { var startSym = $interpolate.startSymbol(), endSym = $interpolate.endSymbol(), self = this; tElement.attr('form-error-tooltip', startSym + 'message' + endSym); angular.forEach(tAttrs.$attr, function(value, attr) { var ddo = $injector.has(attr + 'Directive') ? $injector.get(attr + 'Directive')[0] : {}; if (ddo.terminal && ddo.priority >= self.priority) { tElement.removeAttr(value); } }); return function(scope, element, attrs, controller) { $compile(element)(scope); var ngModelCtrl = element.controller('ngModel') element.on('input blur change', checkValidity); function checkValidity() { if (ngModelCtrl.$error.minlength) { setError(attrs.formError); } else if (element.scope() && element.scope().tt_isOpen) { //avoid tooltip bug element.triggerHandler('close'); } } function setError(message) { scope.message = message; scope.$digest(); //set message to tooltip element.triggerHandler('open'); } }; } }; }); 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рддрддреНрд╡ рдореЗрдВ form-error-tooltip рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ open рдФрд░ close рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рд╡рд╣ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддреА рд╣реИ? рдпрд╣ рд╕рднреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рд╕реНрдерд╛рдкрд┐рдд terminal: true, priority: 100 рдХрд╛рд░рдг terminal: true, priority: 100 рдХреЛрдИ рдЕрдиреНрдп рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓ рдирд┐рд░реНрджреЗрд╢ рдпрд╛ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ ng-if, ng-repeat, ng-include рдЖрджрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рдд рдирд┐рд░реНрджреЗрд╢ рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╡рд┐рд╢реЗрд╖рддрд╛ form-error-tooltip={{message}} , рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ) рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЛ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рди рдХрд░реЗрдВ, рдФрд░ рддрддреНрд╡ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред рдЕрдм рд╕рднреА рд╢реЗрд╖ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреВрд▓рдЯрд┐рдк рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдХреЛрдИ рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╡реНрдпрд╡рд╕реНрдерд╛


рдЗрд╕реА рддрд░рд╣, рд╣рдо рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рддрддреНрд╡ рдХреЛ рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

 app.directive('formPassword', function($compile, $injector) { return { restrict: 'AE', terminal: true, priority: 200, templateUrl: 'passwordTemplate.html', replace: true, scope: true, compile: function(tElement, tAttrs) { var input = tElement.find('input')[0], self = this; angular.forEach(tAttrs.$attr, function(value, attr) { var ddo = $injector.has(attr + 'Directive') ? $injector.get(attr + 'Directive')[0] : {}; if (attr !== 'type' && attr !== 'class' && attr !== 'formPassword' && (!ddo.terminal || ddo.priority < self.priority)) { input.setAttribute(value, tAttrs[attr]); } if (attr !== 'class') { tElement.removeAttr(value); } }); return function(scope) { scope.show = false; } } }; }); 

рдмреЗрд╢рдХ, рдЖрдк tranclude рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рддрддреНрд╡ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдРрд╕реЗ рдмрдЧреАрдЪреЗ рдХреЛ рдмрд╛рдбрд╝ рджреЗрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

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

рд▓рд╛рдЗрд╡ рдЙрджрд╛рд╣рд░рдг: plnkr.co/edit/BSVN7zZb0vNEAXo7iWhM?p?preview

Source: https://habr.com/ru/post/In218385/


All Articles