AngularJS рдореЗрдВ рдирд┐рд░реНрджреЗрд╢

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

рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рддрд┐рд░реВрдкрдХрддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВред

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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред



рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдВрдЧреБрд▓рд░рдпреВрдЖрдИ рдЯреАрдо рдХреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ ред рдЗрд╕ рдЯреАрдо рдореЗрдВ рдЧреИрд░-Google рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдФрд░ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд╡реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рднреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЕрдкрдиреА рдХреБрдЫ рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред рдореИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рди рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред AngularJS рдмрд╣реБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИред рдХрдо рдХреЛрдб => рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ => рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиред рдлрд┐рд░ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде "рд░рд╛рдХреНрд╖рд╕реА" рдШрдЯрдХ рдХреНрдпреЛрдВ рдмрдирд╛рдПрдВ? рдЗрд╕рд▓рд┐рдП, рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк ngmodules.org рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рдпрд╣ AngularJS рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрди рд╕рдХрддреА рд╣реИред

рддреЛ, рдЖрдкрдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬ рдбреЗрд╡рд▓рдкрд░ рдЧрд╛рдЗрдб рдХреЗ рд▓реЗрдЦ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ ред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЯреВрд▓рдЯрд┐рдк рдЖрд╡рд░рдг рдирд┐рд░реНрджреЗрд╢рдХ рдЯреНрд╡рд┐рдЯрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕реЗ


рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рд╕реЛрд░реНрд╕ рдХреЛрдб | рд╕реЛрд░реНрд╕ рдХреЛрдб рдбреЗрдореЛ | рдбреЗрдореЛ

angular.module("ExperimentsModule", []) .directive("tbTooltip", function(){ return function(scope, element, iAttrs) { iAttrs.$observe('title', function(value) { element.removeData('tooltip'); element.tooltip(); }); } }); 


рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 <span class="label label-warning" tb-tooltip title="You should pay order before {{order.cancelDateTime | date:'dd.MM.yyyy HH:mm'}}" > {{order.cancelDateTime | date:'dd.MM.yyyy HH:mm'}} </span> 


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдирдпрд╛ ExperimentsModule ред рдЗрд╕рдХреА рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ (рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЦрд╛рд▓реА рд╕реВрдЪреА) - рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ tbTooltip рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд░рд┐рдПрд╢рди рдбрд╛рдпрд░реЗрдХреНрд╢рдВрд╕ рдХреЛ рд╣рдореЗрд╢рд╛ рд▓реЛрдЕрд░рдХреЗрдорд╕реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП : , - , рдпрд╛ _ ред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рд╡реИрдз рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП x- рдпрд╛ data- рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг: tb:tooltip , tb-tooltip , tb_tooltip , x-tb-tooltip рдФрд░ data-tb-tooltip ред

рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж рдПрдХ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд┐рд╡рд░рдг рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджреА рдЧрдИ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрдм рдЖрдк рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрд▓рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХреЗрд╡рд▓ рдХрд┐рд╕реА рднреА HTML рддрддреНрд╡ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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


рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЪрд░рдгреЛрдВ рдХрд╛ рдХреНрд░рдо рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреЛ рдФрд░ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рдмрдиреЗ рд╣реБрдП рд╣реИрдВред
  1. рдЙрдкрдпреЛрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рди рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдкрд╛рда рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдк (рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди) рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред iAttrs.$observe('title', function(value) { ... }) рдХреЛрдб рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ iAttrs.$observe('title', function(value) { ... }) рдПрдХ рдмрд╛рд░ рдкреНрд░рдХреНрд╖реЗрдк рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрд░реНрдерд╛рдд рдЕрдВрддрд┐рдо рдкрд╛рда рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рдпрд╛ рдЬрдм рдкреНрд░рдХреНрд╖реЗрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЯреНрд╡рд┐рдЯрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЯреВрд▓рд┐рдк рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  2. рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБ рд╢рд╛рдпрдж рдЕрднреА рднреА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреВрд▓рдЯрд┐рдк рдШрдЯрдХ рдХреЗ рддрд░реНрдХ рдХреА рдЪрд┐рдВрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЯреВрд▓рдЯрд┐рдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдорд┐рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рдХреЛрдб element.removeData('tooltip'); рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ element.removeData('tooltip');


рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб


рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рд╕реЛрд░реНрд╕ рдХреЛрдб | рд╕реЛрд░реНрд╕ рдХреЛрдб рдбреЗрдореЛ | рдбреЗрдореЛ

 .directive('uiSource', function () { return { restrict: 'EA', compile: function (elem) { var escape = function(content) { return content .replace(/\&/g, '&') .replace(/\</g, '<') .replace(/\>/g, '>') .replace(/"/g, '"'); }; var pre = angular.element('<pre class="prettyprint linenums"></pre>'); pre.append(prettyPrintOne(escape(elem.html().slice(1)), undefined, true)); elem.replaceWith(pre); } }; }); 


рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 <ui-source> <ui-source> <div> <label>Name:</label> <input type="text" ng-model="yourName" placeholder="Enter a name here"> <hr> <h1>Hello {{yourName}}!</h1> </div> </ui-source> </ui-source> 


Google-code-prettify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ред

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ google-code-prettify рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рд░реЗрдЦрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

  restrict: 'EA', 

рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ 'рдИрдПрд╕реАрдПрдо' рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрддреНрд╡ 'рдИ', рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ 'рдП', рдПрдХ рд╡рд░реНрдЧ 'рд╕реА', рдПрдХ рдЯрд┐рдкреНрдкрдгреА 'рдПрдо' рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  terminal: true, 

рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкрд░ рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЕрдВрддрд┐рдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрдЧреАред рдпрд╛рдиреА рдХреЗрд╡рд▓ рдКрдкрд░ рдФрд░ рдЙрд╕реА рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЙрд╕реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  compile: function (elem) { ... } 

рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ, рд╣рдо рддрддреНрд╡ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ mnemonics рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдХреЛ Google-рдХреЛрдб-рдкреНрд░реАрдЯреАрдЯрд╛рдЗрдЬ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕рднреА рдХреЛ рдкреВрд░реНрд╡ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдлреНрд░реЗрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореВрд▓ рддрддреНрд╡ рдХреЛ рдкрд░рд┐рдгрд╛рдореА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рди рдХрджрдо рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ: рдПрдирдЬреА-рдЕрдЧрд░ , рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреНрд▓реВрдб рдХрд░реЗрдВ ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдЫреЛрдбрд╝реЗрдВ, рдореИрдВ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред

uiPagination


рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рд╕реЛрд░реНрд╕ рдХреЛрдб | рд╕реЛрд░реНрд╕ рдХреЛрдб рдбреЗрдореЛ | рдбреЗрдореЛ

рдХреЛрдб рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

  <ui-pagination cur="pagination.cur" total="pagination.total" display="9"></ui-pagination> 


рдПрдХ рджреГрд╢реНрдп рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рд╕рд┐рдХ рдирд┐рд░реНрджреЗрд╢ред

рдпрд╣рд╛рдБ рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рдЕрд▓рдЧ рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред

 scope: { cur: '=', total: '=', display: '@' }, 


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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рдХреНрд░ рдФрд░ рдХреБрд▓ рдПрдХ рд╣реА рдирд╛рдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреНрд╡рд┐-рджрд┐рд╢рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЙрд╕ рджрд╛рдпрд░реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЙрд╕реА рджрд╛рдпрд░реЗ рд╕реЗ рдЙрд╕реА рдирд╛рдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛: рдпрджрд┐ рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢ NgModelController рдХреЗ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдПрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ (рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рдмрдЪреНрдЪрд╛ рдЧреБрдВрдЬрд╛рдЗрд╢, scope: true рдорд╛рдзреНрдпрдо рд╕реЗ рдШреЛрд╖рд┐рдд scope: true ред рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдПрдирдЬреА-рдореЙрдбрд▓ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ ( ng-model="curPage" ) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЪрд░ ( ng-model="curPage" )ред рд▓реЗрдХрд┐рди рдмрд╕ рдЪрд░ рдФрд░ рдпрд╣ рдПрдирдЬреА-рдореЙрдбрд▓ ( рд╕рдмреВрдд рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ, рдорд┐рдЪрдХреЛ рд╣реЗрд╡рд░реА рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ)ред

uiGrid


рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рд╕реЛрд░реНрд╕ рдХреЛрдб | рд╕реЛрд░реНрд╕ рдХреЛрдб рдбреЗрдореЛ | рдбреЗрдореЛ

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

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 $scope.data = [ { column1: 'aaa', column2: '333', column3: 'aaa', column4: 'sdf' }, { column1: 'bbb', column2: '222', column3: 'zzz', column4: 'sdf' }, { column1: 'ccc', column2: '111', column3: 'ddd', column4: 'sdf' } ] <ui-grid source="data"> <column name="column1"></column> <column name="column2" sortable="true"></column> <column name="column3" sortable="true"></column> </ui-grid> 


рдпрд╣рд╛рдВ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рд╣реИред рдпрд╣ рдЗрд╕ рдХреЛрдб рдХреА require: '^uiGrid' рдореВрд▓ рддрддреНрд╡реЛрдВ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ link: function (scope, element, attrs, uiGridCtrl) { ... } рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ link: function (scope, element, attrs, uiGridCtrl) { ... } ред

рдирд┐рд╖реНрдХрд░реНрд╖


рд▓реЗрдЦ рдмрд▓реНрдХрд┐ рдмрдбрд╝рд╛ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдорд╛рдирд╛ред рдбреЗрд╡рд▓рдкрд░ рдЧрд╛рдЗрдб рдкрдврд╝реЗрдВ - рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╡рд┐рд╕реНрддреГрдд рд╣реИред Google+ рдкрд░ рд╕рдореБрджрд╛рдп рд╕реЗ рдЬреБрдбрд╝реЗрдВ - рд╡рд╣рд╛рдВ рдкрджреЛрдВ рдХрд╛ рдХреЛрдИ рд╣рд┐рдорд╕реНрдЦрд▓рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдХрд╛рдлреА рдмрд╛рд░ рдЖрддреЗ рд╣реИрдВред

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


All Articles