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

<input ng-model="user.password" ng-minlength="6" form-password form-error=" 6 ">
рдХрд┐рддрдиреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ 7 рд╣реИрдВ
ng-model
ng-minlength
form-password
- рдЗрдирдкреБрдЯ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдВрдЦ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ (рдкрд╛рд╕рд╡рд░реНрдб / рдкрд╛рда) рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИform-error
- рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд▓рдВрдмреЗ рд╕рдордп рддрдХ рди рд╣реЛ рддреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдЯреВрд▓рдЯрд┐рдк рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИform-error-tooltip
- рдЯреВрд▓рдЯрд┐рдк рдХреЛ рддрддреНрд╡ рдХреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рддрд╛ рд╣реИform-error-tooltip-template
- form-error-tooltip-template
рд╕рд╛рде рд╕рд╣рд╛рдпрдХ рдирд┐рд░реНрджреЗрд╢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) {
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рддрддреНрд╡ рдореЗрдВ
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