рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП AngularJS рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдЯреЛрдЯрдХреЗ

AngularJS рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд╛рд╕ рдХрдИ рд╕рд╡рд╛рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рддрдХ, рд╡рд╣ jQuery рдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рдорд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдХреБрдЫ рддрд░рдХреАрдмреЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рд╢реБрд░реБрдЖрддреА AngularJS Developers рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреАред

рдЖрд╡реЗрджрди рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрдХ


рдЬрдм рддрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдФрд░ рд╕рднреА рдЕрдиреБрд░реЛрдз рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдирдЬреА-рдХреНрд▓реЛрдХ рднреА рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЖрдорддреМрд░ рдкрд░ рдРрд╕реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ div рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреА рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ z-index рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рддрдм рддрдХ рдУрд╡рд░рд▓реИрдк рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдШрдЯрдХ рдФрд░ рд░рд╛рдЬреНрдп рд▓реЛрдб рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:

<div class="loader" ng-show="loader"><div class="loader-content">Loading...</div></div> 


рдФрд░ рдЙрдирдХреА рд╢реИрд▓реА рдЗрд╕ рддрд░рд╣ рд╣реИрдВ:

  .loader { position: fixed; width: 100%; height: 100%; z-index: 9; } .loader-content { width: 128px; height: 128px; overflow: auto; margin: auto; position: absolute; z-index: 10; top: 0; left: 0; bottom: 0; right: 0; } 

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

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдХреЛрдИ рднреА рд╕рдВрдЪрд╛рд▓рди рд╣реИ, $ rootScope.loader рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВред рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 'use strict'; app.factory('StateManager', function StatemManager($rootScope, $log) { var stateContainer = []; return { add: function (service) { stateContainer.push(service); $rootScope.globalLoader = true; $log.log('Add service: ' + service); }, remove: function (service) { stateContainer = _.without(stateContainer, service); $log.log('Remove service: ' + service); if (stateContainer.length === 0) { $rootScope.globalLoader = false; $log.log('StateContainer is empty.'); } }, getByName: function (service) { return _.include(stateContainer, service) }, clear: function () { stateContainer.length = 0; $log.log('StateContainer clear.'); return true; } } }); 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдпрд╣ рд╕реЗрд╡рд╛ рдПрдХ рдкрд╛рд░рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╛рдо рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд▓рд┐рдЦрддреА рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред рдпрджрд┐ рд╕рд░рдгреА рдЦрд╛рд▓реА рд╣реИ, рддреЛ $ rootScope.loader рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рд╣реИред рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 StateManager.add('Load_json_data'); var request = $http.get('/data.josn'); request.success(function(response) { console.log(response); StateManager.remove('Load_json_data'); }); 


рдмреЗрд╢рдХ, рдпрд╣ рдПрдХ рдЖрджрд░реНрд╢ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдШрдЯрдирд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрдм рд╣рдореЗрдВ рдПрдирдХрд╛рдЙрдВрдЯрд░ рдкрд░, рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдЗрд╡реЗрдВрдЯ рдпрд╛ рдПрд▓рд┐рдореЗрдВрдЯ рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред рдмреЗрд╢рдХ, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ $ рдШрдЯрдирд╛ рд╣реИ:

 <ul> <li ng-repeat="name in names" ng-bind="name" ng-click="setActive($event);"></li> </ul> 


 $scope.names = ['John', 'Peter', 'Joe']; $scope.setActive = function (evt) { angular.element(evt.target).addClass('active'); } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬрдм рдЖрдк рд╕реВрдЪреА рд╕реЗ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрдХреНрд╖рд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, angular.element jqLite рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ jQuery рдХреЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред

AngularJS рдФрд░ PHP


AngularJS рдХреЗ рдХрдИ рдирдП рд▓реЛрдЧ рд╣реИрд░рд╛рди рд╣реИрдВ рдХрд┐ php рдЗрд╕реЗ рднреЗрдЬреЗ рдЧрдП POST рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдмрд╕ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЦреБрдж рдХрд╣рддреЗ рд╣реИрдВ, AngularJS рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реИ, рдЬреЛ php рдХреЗ рд▓рд┐рдП рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдмрддрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦ рд╣реИред рдпрджрд┐ рдЖрдк $ http рд╕реЗрд╡рд╛ рдХреЛ jQuery.ajax рд╢реИрд▓реА рдореЗрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ AngularJS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
 angular.module('MyModule', [], function($httpProvider) { // Use x-www-form-urlencoded Content-Type $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; // Override $http service's default transformRequest $httpProvider.defaults.transformRequest = [function(data) { /** * The workhorse; converts an object to x-www-form-urlencoded serialization. * @param {Object} obj * @return {String} */ var param = function(obj) { var query = ''; var name, value, fullSubName, subName, subValue, innerObj, i; for(name in obj) { value = obj[name]; if(value instanceof Array) { for(i=0; i<value.length; ++i) { subValue = value[i]; fullSubName = name + '[' + i + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if(value instanceof Object) { for(subName in value) { subValue = value[subName]; fullSubName = name + '[' + subName + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if(value !== undefined && value !== null) { query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&'; } } return query.length ? query.substr(0, query.length - 1) : query; }; return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data; }]; }); 


рдХреИрд╢рд┐рдВрдЧ ($ cacheFactory)


рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╢реБрд░реБрдЖрддреА рдЗрд╕ рд╕реЗрд╡рд╛ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рд░реНрдЧ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп, рдПрдХ POST рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд▓рд╛рдХрд╛рд░ рдХреЗ рдПрд▓реНрдмрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:

 var request = $http.get('/albums.json'); request.success(function (response) { $scope.albums = response; }); 

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

 app.factory('DataCache', function ($cacheFactory) { return $cacheFactory('dataCache', {}); }); 

рдФрд░ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 app.controller('AlbumsCtrl', function (DataCache) { var $scope.albums = DataCache.get('albums'); if (!$scope.albums) { var request = $http.get('/albums.json'); request.success(function (response) { DataCache.put('albums', response); $scope.albums = response; }); } }); 


рдЕрдм, рдпрджрд┐ рдХреИрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдПрд▓реНрдмрдо рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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


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

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


All Articles