рд╢реБрдн рджрд┐рди, рд╣рдмреНрд░реЛрд╕реИрдХреНрд╡рд┐рдЯреА! рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рд╕рдорд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред рд▓реЗрдЦ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рддреНрд░реБрддрд╛ рдХреЗ рдХрд░реАрдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ
рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред
рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕ рдХрджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░ рд╕рдореГрджреНрдз рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЕрдЧрд▓реА рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛ рдЧрдпрд╛:
(function($) { var initListeners = function() { } var updateListeners = function() { } var createUser = function() { } var updateUser = function() { } var parseResponse = function() { } initListeners(); })(jQuery)
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб 100 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреЗ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХрд╛ рдХреЛрдИ рднреА рд╕рдВрд╢реЛрдзрди рдорд╣рдВрдЧрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдб 200 рдпрд╛ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рддрдХ рдмрдврд╝рддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рд╣реИрдВ: рд░реВрдЯреАрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ (рдШрдЯрдирд╛ рдкреНрд░рдмрдВрдзрди, JSON рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛), рдкреЗрдЬрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд░реНрдгрди, рдФрд░ рдордЬрдмреВрдд HTML рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдХреНрд╕рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓рдмреИрдХ рдХреЗ рдПрдХ mishmash рдореЗрдВ рдлрд┐рд╕рд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕реНрддрд░ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рдорд╛рдпрд╛рд╡реА рддрд░реНрдХред рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЪреБрдирд╛рд╡
MVVM рдиреЙрдХрдЖрдЙрдЯJS рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдкрдбрд╝рд╛ рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- DOM рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рджреБрдИ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (IMHO, jQuery рд╕реЗ рд▓рд╛рдЗрд╡ рдПрдХ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ)
- JSON рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдореЙрдбрд▓ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рддрдВрддреНрд░ рдПрдХ рдХрд╛рдВрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ
- DOM рддрддреНрд╡реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрдирдХреА рд╕реБрд╡рд┐рдзрд╛ рд╕рдорд╛рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдиреЙрдХрдЖрдЙрдЯJS рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЛрдЯреА рдФрд░ рдордХреНрдЦрди рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╛рдХреГрддрд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИ)
- рд▓рдВрдЪ рдмреНрд░реЗрдХ рдХреЗ рджреМрд░рд╛рди рднреА рдзреАрд░реЗ-рдзреАрд░реЗ рдиреЙрдХрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
рд╣рдо рд╕рдорд╕реНрдпрд╛ рдмрддрд╛рддреЗ рд╣реИрдВ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
{ Id : "", Surname: "", FirstName: "", PatronymicName: "", Login: "", EMail: "" }
рдпрд╣ рднреА рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
- рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рднреЗрдЬреЗрдВ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝реЗрдВ / рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ
рдЗрди рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рдареВрдВрда рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
function DataGate() { var modelStub = { users: [...] }; return { Load : function(callback) { callback(modelStub); }, DeleteUser : function(callback, id) { callback(true); }, SaveOrUpdateUser : function(callback, user) { callback(user); } } } var gate = new DataGate();
рд╣рдо рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВ рдкреГрд╖реНрда рддрддреНрд╡реЛрдВ рдХреЛ рдирд╛рдо рджреВрдВрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ HTML рдХреЛрдб рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рд╕рд░реНрд╡рд░ рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪреА рд╕реЗ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдЪрдпрдирд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪреА рдХреЗ рдКрдкрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
- рдЖрдк рд╕реВрдЪреА рдХреЗ рдКрдкрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
- рд╕реВрдЪреА рдХреЗ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реВрдЪреА рдореЗрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд╛рдЗрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рдХреЗ рдкрд╣рд▓реЗ рдХреЙрд▓рдо рдореЗрдВ рдПрдХ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдирд╛рдо, рдЙрдкрдирд╛рдо рдФрд░ рд╕рдВрд░рдХреНрд╖рдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХреЙрд▓рдо рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рд╕рднреА рдлрд╝реАрд▓реНрдб рд╕реВрдЪреА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рд╕рдордЧреНрд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕реАрдзрд╛ рд╕рдВрдкрд╛рджрди рдПрдХ рд╣рд┐рдЯ рдЧреАрдд рд╣реИ, рдЬреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ
рд╕рдорд╛рдзрд╛рди рд╣реИ )ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕реВрдЪреА рдХреЗ рдЕрдВрджрд░ рдЗрд╕рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрд╡рд╛рдж рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рд╕реВрдЪреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рдХреЗ ViewModel рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рддрдм рд╕реВрдЪреА рдХрд╛ ViewModel, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж html рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдкрд╛рджрди рдХрд╛ ViewModel рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рд╕рдВрд╡рд╛рдж рдХреЗ рдореВрд▓ рднрд╛рдЧ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ ViewModel рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
var viewModel = { selectedUser : ko.observable(null),
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ,
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдВ рд╣реЛрдВрдЧреЗ? ViewModel рдПрдХ
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ JSON рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛
POJI рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ
рдСрдмреНрдЬрд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ
рдмрдирд╛рдПрдЧрд╛ ред рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрд╛рд░рдг рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА "рдХрд╛рд╕реНрдЯрд┐рдВрдЧ" рдХреИрд╕реЗ рддрд░реАрдХреЛрдВ рдФрд░ рдСрдмреНрдЬрд░реНрд╡рд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде, KNockoutJS рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛рдЧреЗрдЯ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
{ users: [...] }
рд╣рд╛рдВ, рдореИрдкрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж рд╡реНрдпреВрдХреЛрдб рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐
рдПрдХ рдСрдмреНрдЬрд░реНрд╡рд░ рд╕рд░рдгреА рд╣реЛрдЧрд╛ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдкрд┐рдВрдЧ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдкреВрд░рд╛ рдЧреНрд░рд╛рдлрд╝ рдСрдмреНрдЬрд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдорд╛рди рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдРрд╕реА рдореИрдкрд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рдлрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
- рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рддреЛ рдЙрдирдХреЗ рдмреАрдЪ рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдб рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
var mapping = { users: { key: function(data) { return ko.utils.unwrapObservable(data.Id); }, create: function(options) { return new userMapping(options.data); } } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
var userMapping = function(user) { ko.mapping.fromJS(user, {}, this); this.FIO = ko.dependentObservable(function() { return this.Surname() + " " + this.FirstName() + " " + this.PatronymicName(); }, this); var _self = this; this.select = function() { viewModel.selectedUser(_self); } this.edit = (function() { })(); }
рдкреГрд╖реНрда рдкрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдб рдХрд░реЗрдВ:
$(function() { gate.Load(function(loadedModel) { ko.mapping.fromJS(loadedModel, mapping, viewModel); ko.applyBindings(viewModel); }); });
HTML рдХреЛрдб
рд╕рднреА рдХреЛрдб <body> рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ:
<h2> </h2> <div data-bind="jqueryui : 'buttonset'"> <button data-bind="click: createUser"></button> <button data-bind="click: deleteSelectedUser, enable: selectedUser() !== null"></button> </div> <div id="UserListTable"> <div> <table class="list"> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody data-bind="template: {name: 'editUsersRow', foreach: users, templateOptions: { current: selectedUser } }"> </tbody> </table> </div> </div> <script type="text/html" id="editUsersRow"> <tr data-bind="attr: { 'data-id': Id }, click: select, css: { selected: $data == $item.current() }"> <td><a href="#" data-bind="text: FIO, click: edit"></a></td> <td data-bind="text: Login"></td> </tr> </script>
рдХреЛрдб рдкрд░ рдХреБрдЫ рдиреЛрдЯ:
- Jquery ui рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, KNockoutJS рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝рд╛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдмрдЯрди рд╕рдорд░реНрдерди / рдЕрдХреНрд╖рдо рдХрд░реЗрдВред рд▓реЗрдЦрдХ рд╕реЗ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИ ред
- ViewModel рдХреЗ рд╕рднреА рддрд░реАрдХреЗ рдФрд░ рдЧреБрдг рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
- рд╡рд┐рд╢реЗрд╖ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: $ рдЖрдЗрдЯрдо рдФрд░ $ рдбреЗрдЯрд╛ред рдкрд╣рд▓рд╛ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдСрдкреНрд╢рдВрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рджреВрд╕рд░рд╛ рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ ViewModel рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред EditUserRow рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП, ViewModels рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╡реНрдпреВ рд╡реНрдпреВрдореЙрдбрд▓ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
- рдЙрджрд╛рд╣рд░рдг рдмрд╛рдзреНрдпрдХрд╛рд░реА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛, рди рдХрд┐ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ, рдЬреЛ рд╕рдВрдЧреНрд░рд╣> 100 рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдиреНрдпреВрдирддрдо рд╣реИ, HTML рдХреЛрдб рдХреЙрдореНрдкреИрдХреНрдЯ, рдЧрддрд┐рд╢реАрд▓ рдФрд░ рдкрддрд▓рд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ рдПрдбрд┐рдЯ / рдбрд┐рд▓реАрдЯ / рдЗрдВрд╕рд░реНрдЯ рдЯреЗрдмрд▓ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛ-рдкреНрд▓рдЧрд┐рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ
рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рди рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╕рдВрд╡рд╛рдж рдмрдирд╛рдПрдБ / рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░реНрдпрд╛рдкреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП, рд╕рдВрд╡рд╛рдж рдХреЗ рдПрдХ рдЕрд▓рдЧ ViewModel рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЕрдзрд┐рдорд╛рдирддрдГ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдВрдкрд╛рджрди рд╕рдВрд╡рд╛рдж рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдЪрдпрдирд┐рдд рдПрдХ рд╕реЗ POJO рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдпрд╣ рдСрдкрд░реЗрд╢рди рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдпрд╛ рдПрдХ рдЦрд╛рд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ POJO рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ (рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВ)
- рд╕рдВрд╡рд╛рдж рдмреЙрдбреА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ HTML рдХреЛрдб рдмрдирд╛рдПрдБред
- рдирд┐рд░реНрдорд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ jQuery рдпреВрдЖрдИ рд╕рдВрд╡рд╛рдж рдУрд╡рд░рд▓реЗред
- рдпрджрд┐ рд╕рдВрд╡рд╛рдж рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ ViewModel рдХреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдореВрд▓ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдпрд▓ рдХрд░реЗрдВред
рдХреЛрдб рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рдорд╛рдзрд╛рди:
function buildEditUserDlg(model, closeCallback){ return $("#editUserDlg").tmpl().dialog({ title: model.FIO()+" ", width: 400, create: function(e) { var _self = this; ko.applyBindings(model, e.target); model.FIO.subscribe(function(newValue) { $(_self).dialog("option", "title", newValue+" "); }); model.isOperationComplete.subscribe(function(newValue){ if (newValue === true) $(_self).dialog("close"); }) }, close: function(e) { $(this).dialog("destroy").remove(); closeCallback(); }, buttons: { "" : function() { model.save(); }, "": function() { $(this).dialog("close"); } } }); }
рдпрд╣ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдВрд╡рд╛рдж рдХреЗ рд╢реБрд░реБрдЖрддреА рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ (рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореИрдкрд┐рдВрдЧ рдХреЛрдб рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ:
this.edit = (function() { var currentDialog = null; return function() { if (currentDialog != null) { return; } var dialogModel = new userEditDialogMapping(ko.mapping.toJS(_self)); currentDialog = buildEditUserDlg(dialogModel, function() {currentDialog = null}); }; })();
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рдВрд╡рд╛рдж рдХреНрд▓реЛрдЬрд░ рдХреЙрд▓рдмреИрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╛рдп рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
HTML рдХреЛрдб
<script type="text/html" id="editUserDlg"> <div> <table> <tbody> <tr> <th><label for="surname">:</label></th> <td><input maxlength="20" name="surname" data-bind="value: Surname" type="text" value=""></td> </tr> <tr> <th class="property"><label for="firstname">:</label></th> <td><input maxlength="20" data-bind="value: FirstName" name="firstname" type="text"></td> </tr> <tr> <th class="property"><label for="patronymicname">:</label></th> <td><input maxlength="20" name="patronymicname" data-bind="value: PatronymicName" type="text" value=""></td> </tr> <tr> <th class="property"><label for="email">E-Mail:</label></th> <td><input maxlength="30" name="email" data-bind="value: EMail" type="text" value=""></td> </tr> <tr> <th class="property"><label for="login">:</label></th> <td><input maxlength="20" name="login" data-bind="value: Login" type="text" value=""></td> </tr> </tbody> </table> </div> </script>
рд╡рд╣ рд╕рдм рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рд╣реИ!
PSред HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?